基于dfs
dfn[i]表示点1到i的距离,low[i]表示点i的根节点为low[i],从点low[i]和点i可以相互到达
dfs点1,如果low数组全为1,即1可以和其他所有点相互到达,则输出Yes
代码如下:
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
int dfn[10009],low[10009];
int n,m,time;
vector<int> vec[10009];
void dfs(int cur)
{
dfn[cur]=low[cur]=time++;
for(vector<int>::iterator it=vec[cur].begin();it!=vec[cur].end();it++)
{
if(dfn[*it])
low[cur]=low[cur]>dfn[*it]?dfn[*it]:low[cur];
else{
dfs(*it);
if(low[cur]>low[*it])
low[cur]=low[*it];
}
}
}
int main()
{
int fr,to,i;
while(scanf(" %d %d",&n,&m),n||m)
{
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
for(i=1;i<=n;++i)
vec[i].clear();
time=1;
for(i=0;i<m;++i)
{
scanf(" %d %d",&fr,&to);
vec[fr].push_back(to);
}
dfs(1);
for(i=1;i<=n;++i)
if(low[i]!=1) break;
if(i==n+1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}