这题考的是图的强连通性问题,如果不了解的话建议先查下资料(《算法导论》中介绍得很详细)。
//图的强连通性问题
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
const int N=10005;
vector<int> m1[N],m2[N];
int st[N],top;//保存拓扑序列
bool visit[N];
int n,m;
using namespace std;
void dfs1(int u)//正向遍历
{
visit[u]=true;
for(int i=0;i<m1[u].size();i++)
{
int j=m1[u][i];
if(!visit[j])
dfs1(j);
}
st[top++]=u;
}
void dfs2(int u)//反向遍历
{
visit[u]=true;
for(int i=0;i<m2[u].size();i++)
{
int j=m2[u][i];
if(!visit[j])
dfs2(j);
}
}
bool Kosaraju()
{
top=0;
for(int i=1;i<=n;i++)
if(!visit[i])
dfs1(i);
for(int i=1;i<=n;i++)
visit[i]=false;
dfs2(st[top-1]);
for(int i=1;i<=n;i++)
if(!visit[i])
return false;
return true;
}
int main()
{
int a,b;
while(scanf("%d%d",&n,&m),n+m)
{
//初始化
for(int i=1;i<=n;i++)
{
m1[i].clear();
m2[i].clear();
visit[i]=false;
}
//建边
while(m--)
{
scanf("%d%d",&a,&b);
m1[a].push_back(b);
m2[b].push_back(a);
}
if(Kosaraju())
printf("Yes\n");
else
printf("No\n");
}
return 0;
}