java绘制有向图,AcWing 848. 【Java】有向图的拓扑序列

import java.util.*;

public class Main

{

static int N = 100010;

static int[] in = new int[N];

static int[] h = new int[N];

static int[] e = new int[N];

static int[] ne = new int[N];

static int n = 0;

static int idx = 0;

static List[HTML_REMOVED] q = new LinkedList<>();

public static void add(int a,int b)

{

e[idx] = b;

ne[idx] = h[a];

h[a] = idx++;

}

public static boolean topology()

{

//把所有入度为0的点入队

for(int i = 1; i <= n; i++)

{

if(in[i] == 0) q.add(i);

}

while(q.size() != 0)

{

int t = q.remove(0);

for(int i = h[t]; i != -1; i = ne[i])

{

int j = e[i];

in[j]--;

if(in[j] == 0) q.add(j);

}

}

return q.size() == n;

}

public static void main(String[] args)

{

Scanner input = new Scanner(System.in);

n = input.nextInt();

int m = input.nextInt();

while(m-- > 0)

{

int a = input.nextInt();

int b = input.nextInt();

add(a,b);

in[b]++;

}

if(topology())

{

Iterator temp = q.iterator();

while(temp.hasNext()) System.out.print(temp.next() + " ");

}

else

{

System.out.println("-1");

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值