刚学 其实操作很简单 正向建立一个图 跑一遍 标记上时间 然后反过来再跑一遍(注意有可能区域不联通) 标记mark
Korasaju algorithm
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
int vis[300];
int edge[300][300];
int tedge[300][300];
int mark[300];
int n,m;
int cnt=0;
int flag=0;
int now[300];
int nex[300];
int x=1;
void dfs(int start)
{
for(int i=1;i<=n;i++)
{
if(i!=start&&!vis[i]&&edge[start][i])
{vis[i]=1;now[i]=++cnt;dfs(i);nex[i]=++cnt;}
// cout<<start<<' '<<i<<endl;
}
}
void dfsop(int start)
{
for(int i=1;i<=n;i++)
{
if(i!=start&&!vis[i]&&tedge[start][i])
{
cout<<start<<' '<<i<<endl;
vis[i]=1;mark[i]=flag;dfsop(i);
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
int s,e;
cin>>s>>e;
edge[s][e]=1;
tedge[e][s]=1;
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
vis[i]=1;
now[i]=++cnt;
dfs(i);
nex[i]=++cnt;
}
}
memset(vis,0,sizeof(vis));
for(int i=2*n;i>=1;i--)
{
for(int j=1;j<=n;j++)
if(nex[j]==i)
{
if(!vis[j])
{
mark[j]=++flag;
vis[j]=1,dfsop(j);
break;
}
}
}
for(int i=1;i<=n;i++) cout<<now[i]<<' ';
cout<<endl;
for(int i=1;i<=n;i++) cout<<mark[i]<<' ';
cout<<endl;
cout<<flag<<endl;
return 0;
}