| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
总是RE,追了好久也不知道哪里出了问题,各位大虾帮我看看好吗?import java.io.*;
import java.util.*;
import java.math.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
System.out));
String[] temp = in.readLine().split(" ");
int n = Integer.parseInt(temp[0]);
int m = Integer.parseInt(temp[1]);
SCC scc = new SCC(n);
for(int i = 0; i < m; i++){
StringTokenizer st = new StringTokenizer(in.readLine());
int a = Integer.parseInt(st.nextToken()) - 1;
int b = Integer.parseInt(st.nextToken()) - 1;
scc.link[a].add(b);
scc.conlink[b].add(a);
}
int res = scc.genDAG();
if(res >= 0){
out.write(scc.val[res] + "\n");
}
else{
out.write("0\n");
}
out.flush();
}
}
class SCC{
public int[] f, par, val, in;
public boolean[] vis;
public LinkedList<Integer>[] link, conlink;
public int index, n, ans;
public boolean[][] map;
public SCC(int a){
n = a;
f = new int[n];
par = new int[n];
vis = new boolean[n];
link = new LinkedList[n];
conlink = new LinkedList[n];
for(int i = 0; i < n; i++){
link[i] = new LinkedList<Integer>();
conlink[i] = new LinkedList<Integer>();
}
index = 0;
ans = 0;
}
public void dfs(int cur){
vis[cur] = true;
for(int i = 0; i < link[cur].size(); i++){
Integer t = (Integer)link[cur].get(i);
if(!vis[t]){
dfs(t);
}
}
f[this.index++] = cur;
}
public void condfs(int cur){
vis[cur] = true;
par[cur] = this.ans;
for(int i = 0; i < conlink[cur].size(); i++){
Integer t = (Integer)conlink[cur].get(i);
if(!vis[t]){
condfs(t);
}
}
}
public int genDAG(){
Arrays.fill(vis, false);
for(int i = 0; i < n; i++){
if(!vis[i])
dfs(i);
}
Arrays.fill(vis, false);
for(int i = n - 1; i >= 0; i--){
if(!vis[f[i]]){
condfs(f[i]);
this.ans++;
}
}
in = new int[this.ans];
val = new int[this.ans];
for(int i = 0; i < n; i++){
val[par[i]]++;
for(int j = 0; j < conlink[i].size(); j++){
int t = (Integer)conlink[i].get(j);
if(par[i] == par[t])
continue;
in[par[t]]++;
}
}
int count = 0;
int which = -1;
for(int i = 0; i < this.ans; i++){
if(in[i] == 0){
count++;
which = i;
}
}
if(count == 1)
return which;
return -1;
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator