您的位置:首页 > 其它

hdu 1269 迷宫城堡 tarjan判断缩点个数是否为1

2012-05-28 22:37 435 查看
/*

题目:
求图中的任意两顶点是否两两互达

分析:
tanjan算法求得缩点的个数,判断是否为一即可

*/
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

const int V = 100005;

vector<int> adj[V];

int dfn[V],stack[V],low[V],bcnt,depth,top;
bool instack[V];
int n,m;
//int father[V];

void tarjan(int u)
{
instack[u] = true;
stack[++top] = u;
low[u] = dfn[u] = ++depth;
int len = adj[u].size();
int v;
for(int i=0;i<len;i++)
{
v = adj[u][i];
if(!low[v])
{
tarjan(v);
low[u] = min(low[u],low[v]);
}
else if(instack[v])
low[u] = min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
++bcnt;
do
{
v = stack[top--];
instack[v] = false;
//father[v] = bcnt;
}while(u!=v);
}
}

int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
int x,y;
while(scanf("%d%d",&n,&m),n||m)
{
for(int i=1;i<=n;i++)
adj[i].clear();
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
adj[x].push_back(y);
}
memset(instack,false,sizeof(instack));
memset(low,0,sizeof(low));
bcnt = depth = top = 0;
for(int i=1;i<=n;i++)
if(!low[i])
tarjan(i);
if(bcnt==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: