编程语言:Java
题目:
题解:拓扑排序
结果:AC
import java.io.*;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static Scanner sc = new Scanner(new BufferedInputStream(System.in));
static int[][] graph=new int[101][101];
static int[] dis=new int[101];
static int[] indegree=new int[101];
static int max= (int) 1e8;
public static void main(String[] args) throws IOException {
in.nextToken();
int n= (int) in.nval;
in.nextToken();
int m= (int) in.nval;
for(int i=0;i<n;i++)
Arrays.fill(graph[i], max);
for (int i = 0; i < m; i++) {
in.nextToken();
int s= (int) in.nval;
in.nextToken();
int e= (int) in.nval;
in.nextToken();
int cost= (int) in.nval;
graph[s][e]=cost;
indegree[e]++;
}
Queue<Integer> que=new LinkedBlockingQueue<>();
for(int i=0;i<n;i++){
if(indegree[i]==0)
que.add(i);
}
int num=0;
int time=0;
while(!que.isEmpty()){
int p=que.poll();
num++;
for(int i=0;i<n;i++){
if(graph[p][i]!=max) {
if(--indegree[i]==0)
que.add(i);
if (dis[i] < dis[p] + graph[p][i])
dis[i]=dis[p]+graph[p][i];
if(dis[i]>time)
time=dis[i];
}
}
}
if(num==n)
out.println(time);
else
out.println("Impossible");
out.flush();
}
}