强连通分量与缩点的模板题

之前一直不知道缩点是怎么回事 原来就是体现在belong[n]数组里了..

 

#include <bits/stdc++.h>
using namespace std;

struct node
{
int v;
int next;
};

stack <int> stk;
node edge[10010];
int first[10010],degree[10010];
int dfn[10010],low[10010],book[10010],belong[10010],sum[10010];
int n,m,cnt,num;

void addedge(int u,int v)
{
edge[num].v=v;
edge[num].next=first[u];
first[u]=num++;
return;
}

void calculate();
void dfs(int cur);

int main()
{
int i,u,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(first,-1,sizeof(first));
num=0;
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
}
calculate();
}
return 0;
}

void calculate()
{
int i,j,v,sum1,sum2,p;
while(!stk.empty()) stk.pop();
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(book,0,sizeof(book));
memset(belong,0,sizeof(belong));
memset(sum,0,sizeof(sum));
cnt=0,num=0;
for(i=1;i<=n;i++)
{
if(dfn[i]==0)
{
dfs(i);
}
}
memset(degree,0,sizeof(degree));
for(i=1;i<=n;i++)
{
for(j=first[i];j!=-1;j=edge[j].next)
{
v=edge[j].v;
if(belong[v]!=belong[i])
{
degree[belong[i]]++;
}
}
}
sum1=0,sum2=0;
for(i=1;i<=num;i++)
{
if(sum[i]>1) sum1++;
if(degree[i]==0)
{
sum2++;
p=i;
}
}
printf("%d\n",sum1);
if(sum2==1&&sum[p]>1)
{
for(i=1;i<=n;i++)
{
if(belong[i]==p)
{
printf("%d ",i);
}
}
printf("\n");
}
else
{
printf("-1\n");
}
return;
}

void dfs(int cur)
{
int i,v;
stk.push(cur);
book[cur]=1;
cnt++;
dfn[cur]=cnt,low[cur]=cnt;
for(i=first[cur];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(dfn[v]==0)
{
dfs(v);
if(low[v]<low[cur])
{
low[cur]=low[v];
}
}
else
{
if(book[v]==1&&dfn[v]<low[cur])
{
low[cur]=dfn[v];
}
}
}
if(dfn[cur]==low[cur])
{
num++;
while(!stk.empty())
{
v=stk.top();
stk.pop();
book[v]=0;
belong[v]=num;
sum[num]++;
if(v==cur) break;
}
}
return;
}