这个题目太讨厌了,提交了几次,都说超时,看了下讨论发现思路没毛病。
参照别人的代码,修改了下输出AC了
package com.company.luogu;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class P3916 {
static List<Integer>[] lists;
static boolean[] visited;
static int[] res;
public static void main(String[] args) throws Exception{
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(reader.readLine());//第1 行,2 个整数N,M。 给出N个点,M条边的有向图
int N=Integer.parseInt(st.nextToken());//N个点
int M=Integer.parseInt(st.nextToken());//M条边
lists=new List[N+1];
visited=new boolean[N+1];
res=new int[N+1];
for (int i = 0; i <lists.length ; i++) {
lists[i]=new ArrayList<Integer>();
res[i]=i;
}
for (int i = 0; i <M ; i++) {
st=new StringTokenizer(reader.readLine());
int start=Integer.parseInt(st.nextToken());
int end=Integer.parseInt(st.nextToken());
//要反向建边
lists[end].add(start);
}
for (int i = N; i >0 ; i--) {
DFS(i,i);
}
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
for (int i = 1; i < res.length; i++) {
out.print(res[i] + " ");
}
out.flush();
/*for (int i = 1; i <res.length ; i++) {
System.out.printf("%d ",res[i]);
}*/
reader.close();
}
public static void DFS(int start,int max){
if(visited[start]){
return;
}
visited[start]=true;
res[start]=max;
for (int i:lists[start]) {
DFS(i,max);
}
}
}