我遇到了这个问题,我必须计算前5个强连接组件的大小。
前5名是指前5名(顶点数)
有向图边缘的链接是here.
这是我用过的代码,但我的答案出错了。问题是,当我在小图上运行代码时,它给了我正确的答案但是当我在链接中提供的文本文件上运行它时给定的问题,答案是错误的。
我的代码计算出的前5个SCC的大小出错了。
import java.util.*;
import java.io.*;
class SCC
{
private ArrayList<LinkedList<Integer>> adj_list;
private ArrayList<LinkedList<Integer>> adj_list2;
private LinkedList<Integer> top_5;
private BufferedReader br;
private Stack<Integer> st;
private boolean second_dfs=false;
private char []visited;
private int size=0;
private int not_again=-1;
public void create_graph()throws IOException
{
String s;
String []arr;
adj_list=new ArrayList<LinkedList<Integer>>();
visited=new char[875714];
for(int i=0;i<875714;++i)
{adj_list.add(new LinkedList<Integer>());visited[i]=48;}
br=new BufferedReader(new FileReader("P4.txt"));
while((s=br.readLine())!=null)
{
arr=s.split(" ");
adj_list.get(Integer.parseInt(arr[0])-1).add(Integer.parseInt(arr[1]));
}
st=new Stack<Integer>();
top_5=new LinkedList<Integer>();
}
public void rev_graph()
{
int i;
ArrayList<LinkedList<Integer>> g1;
g1=new ArrayList<LinkedList<Integer>>();
for(i=0;i<adj_list.size();++i)
g1.add(new LinkedList<Integer>());
for(i=0;i<adj_list.size();++i)
for(int e:adj_list.get(i))
g1.get(e-1).add(i+1);
adj_list=new ArrayList<LinkedList<Integer>>(g1);
}
public void DFS(int v)
{
if(second_dfs==true)
{++size;}
visited[v-1]=49;
for(int e:adj_list.get(v-1))
if(visited[e-1]==48)
DFS(e);
if(second_dfs==false)
st.push(v);
}
public void give_SCC()
{
second_dfs=true;int done=0;
for(int i=0;i<875714;++i)
{visited[i]=48;}
while(!st.isEmpty())
{
size=0;
int v=st.pop();
if(visited[v-1]==48)
{DFS(v);}
if(size!=0)
top_5.add(size);
}
}
public static void main(String []args)throws IOException
{
SCC obj=new SCC();
obj.create_graph();
obj.adj_list2=new ArrayList<LinkedList<Integer>>(obj.adj_list);
obj.rev_graph();
obj.DFS(1);
obj.adj_list=new ArrayList<LinkedList<Integer>>(obj.adj_list2);
obj.give_SCC();
Collections.sort(obj.top_5);
for(int i=obj.top_5.size()-1;i>=obj.top_5.size()-5;--i)
System.out.println(obj.top_5.get(i));
}
}