强连通分量模板题:简单
#include <bits/stdc++.h>
using namespace std;
const int MAX = 10000 + 10;
const int BMAX = 100000 + 10;
struct Edge{
int to, v,next;
}edge[BMAX];
int n, m, head[MAX],EdgeNum;
int Stack[MAX],StackSize;
int vis[MAX],low[MAX],dfn[MAX];
int ComponentMap[MAX], ComponentNum;
void tarjan();
void dfs(int,int);
void add(int,int);
int main(){
// freopen("test.txt","r",stdin);
while(~scanf("%d%d",&n,&m)&(n+m))
{
memset(edge,0,sizeof(edge));
memset(head,-1,sizeof(head));
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
}
tarjan();
int flag = ComponentMap[1] , yes = 1 ;
for(int i=1;i<=n;i++)
if(flag!=ComponentMap[i])
{
printf("No\n"), yes = 0;
break;
}
//cout<<i<<" "<<ComponentMap[i]<<endl;
if(yes)
printf("Yes\n");
}
}
void tarjan(){
ComponentNum = 0;
StackSize = 0;
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
if(vis[i]==0)
dfs(i,1);
}
void dfs(int u,int step)
{
dfn[u] = low[u] = step;
vis[u] = 1;
Stack[StackSize++] = u;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v = edge[i].to;
if(vis[v]==0)
dfs(v,step+1);
if(vis[v]==1)
low[u] = min(low[u],low[v]);
}
if(low[u]==dfn[u])
{
ComponentNum++;
int k;
do{
k = Stack[--StackSize];
ComponentMap[k] = ComponentNum;
vis[k] = 2;
} while(k!=u);
}
}
void add(int x,int y)
{
edge[++EdgeNum].to = y;
edge[EdgeNum].next = head[x];
head[x] = EdgeNum;
}