打算好好复习一遍图论。所谓“温故知新,可以为师矣”。
题意:有向图连通性判断。
方法:只有一个SCC即是。反之不是。
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n,m;
vector<vector<int> >v(10010);
int vis[10010];int dfn[10010];int low[10010];int times=0;
int mark=0;
void tarjarn(int u)
{
dfn[u]=low[u]=++times;
for(int i=0;i<v[u].size();i++)
{
int vv=v[u][i];
if(!vis[vv])
{
vis[vv]=1;
tarjarn(vv);
if(low[vv]<low[u])low[u]=low[vv];
}
else
{
if(dfn[vv]<low[u])low[u]=dfn[vv];
}
}
if(dfn[u]==low[u])
{
mark++;
}
}
int main()
{
while(~scanf("%d %d",&n,&m)&&(m||n))
{
int ta,tb;
for(int i=0;i<=n;i++)
{
v[i].clear();
dfn[i]=low[i]=vis[i]=0;
}
times=0;
for(int i=0;i<m;i++)
{
scanf("%d %d",&ta,&tb);
v[ta].push_back(tb);
}
mark=0;
for(int i=1;i<=n;i++)
{
if(!vis[i])
tarjarn(i);
}
if(mark>1)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}