求求大佬帮萌新修改一下代码
#include<bits/stdc++.h>
using namespace std;
vector<int>e[10000];
vector<int>ef[10000];
vector<int>s;
int vis[10000],color[10000],sccnt;
vector<int>ans[10010];
int n,m;//n个点m条边;
void getorder(int u){
vis[u]=true;
for(int i=0;i<e[u].size();i++){
if(!vis[e[u][i]]) getorder(e[u][i]);//将这个点能连接的点依次入栈
}
s.push_back(u);//人栈
} //getorder遍历的是正图的遍历顺序,按顺序入栈.
void changecolor(int u) {
color[u] = sccnt;
for (int v : ef[u])
if (!color[v]) changecolor(v);//将这个点能连接到的节点,如果没有颜色就染色
}//changecolor选择最后遍历的节点,将他们成为同一颜色
void kosaraju() {
sccnt = 0;//初始化scc的个数为0
for (int i = 1; i <= n; ++i)
if (!vis[i]) getorder(i);//先对正图遍历(按遍历顺序入栈)
for (int i = n-1; i >= 0; --i)//s总共只有n个,vector是从0开始的,dfs2从最晚的节点开始选
if (!color[s[i]]) {//如果当前节点没有颜色则说明之前相同染色的没有染过他,即是一个新的强连通分量。
++sccnt; //联通分量的个数++
changecolor(s[i]);//将这个点变色
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
e[x].push_back(y);//正图;
ef[y].push_back(x);// 反图;
}
kosaraju();
for ( int i=1 ; i<=n ; i++ )
ans[color[i]].push_back(i);//将节点i的颜色push该节点
for ( int i=1 ; i<=sccnt ; i++ ){
cout<<"第"<<i<<"个scc包含:";
for ( int j=0 ; j<ans[i].size() ; j++ )
cout<<ans[i][j]<<' ';
cout<<" 共"<<ans[i].size()<<"个"<<endl;
}
return 0;
}