1. 程式人生 > >hdu1269 迷宮城堡 強連通+dfs

hdu1269 迷宮城堡 強連通+dfs

有向圖中,若對每一對頂點u和v,既存在從u到v的路徑,也存在從v到u的路徑,則稱此有向圖為強連通圖。

//用dfs從每一個結點遍歷圖,如果從該結點可以遍歷到所有的結點,就是強連通的

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define maxn 10005


vector<int>d[maxn];
bool flag[maxn];//標記陣列,用來判斷是否可以到達 
int N,M,ans;


void dfs(int k)
{
int v;
for(int i=0;i<d[k].size();i++)//從容器中已知連通的點出發開始搜尋 
{
v=d[k][i];//容器K中第i個數據v,即k和v相連 
if(!flag[v])
{
ans++;//到達了新的點
flag[v]=true;
dfs(v);
}
}
}


int main()
{
int x,y;
while(scanf("%d%d",&N,&M),N||M)
{
for(int i=0;i<M;i++)
{
scanf("%d%d",&x,&y);
d[x].push_back(y);//在容器尾部加入一個數據。
}
bool F=true;
for(int i=1;i<=N;i++)
{
memset(flag,false,sizeof(flag));
ans=1;
flag[i]=true;
dfs(i);
if(ans!=N)
{
F=false;
break;
}
}
printf("%s\n",F?"Yes":"No");
for(int i=1;i<=N;i++)
d[i].clear();//置0,清空容器 
}
    return 0;
}