分析:本题判断一个图是否是有向强连通分量,这里使用tarjan算法求解。
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
vector<int> map[10002];
stack<int> tarjan_stack;
int low[10002];
int dfn[10002];
bool vis[10002];
int cnt,pos;
void Init(int n)
{
int i;
cnt=pos=0;
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
map[i].clear();
while(!tarjan_stack.empty()) tarjan_stack.pop();
}
void Input(int m)
{
int i,a,b;
for(i=1;i<=m;i++)
{
cin>>a>>b;
map[a].push_back(b);
}
}
void tarjan(int u)
{
int i,t;
dfn[u]=low[u]=++pos;
vis[u]=true;
tarjan_stack.push(u);
for(i=0;i<map[u].size();i++)
{
t=map[u][i];
if(!dfn[t])
{
tarjan(t);
if(low[t]<low[u])
low[u]=low[t];
}
else if(vis[t] && low[u]>dfn[t])
low[u]=dfn[t];
}
if(low[u]==dfn[u])
{
cnt++;
while(!tarjan_stack.empty())
{
t=tarjan_stack.top();
tarjan_stack.pop();
vis[t]=false;
if(t==u) break;
}
}
}
void Solve(int n,int m)
{
int i;
Init(n);
Input(m);
for(i=1;i<=n;i++) //循环防止是森林的情况也能处理
if(!dfn[i])
tarjan(i);
if(cnt==1)
puts("Yes");
else
puts("No");
}
int main()
{
int N,M;
while(cin>>N>>M &&(N||M))
{
Solve(N,M);
}
return 0;
}HDU ACM 1269迷宫城堡->有向强连通分量(tarjan算法实践)
原文地址:http://blog.csdn.net/a809146548/article/details/45269193