今天下午就只看了一下tarjan算法。。。。妈蛋。。。太颓废了。。。这样不好不好~~
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int root[10000],ans,cnt,scc,top;
int dfn[10000],low[10000];
int s[100000],belong[10000];
bool vis[10000];
struct node
{
int e,next;
}a[10000];
void add(int s,int e)
{
a[++ans].e=e;
a[ans].next=root[s];
root[s]=ans;
}
void tarjan(int u)
{
dfn[u]=low[u]=++cnt;
vis[u]=1;
s[top++]=u;
int v;
for(int i=root[u];i!=-1;i=a[i].next)
{
v=a[i].e;
if(dfn[v]==0)
{
tarjan(v);
low[u]=low[u]>low[v]?low[v]:low[u];
}
else if(vis[v] && low[u]>dfn[v])
low[u]=dfn[v];
}
if(dfn[u]==low[u])
{
++scc;
do
{
v=s[--top];
vis[v]=0;
belong[v]=scc;
}while(u!=v);
}
}
int main()
{
int k=8;
ans=cnt=scc=top=0;
// top=0,cnt=0;
ans=-1;
memset(root,-1,sizeof(root));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(belong,-1,sizeof(belong));
while(k--)
{
int s,e;
scanf("%d%d",&s,&e);
add(s,e);
}
tarjan(1);
for(int i=1;i<=6;i++)
{
printf("%d %d\n",i,belong[i]);
}
system("pause");
return 0;
}