您的位置:首页 > 其它

迷宫城堡 HDU - 1269(tarjan求强联通)

2017-09-28 16:01 357 查看
参考代码

http://www.cnblogs.com/zero-begin/p/4795871.html

题意:给一个有向图,问它是不是一个强连通图,如果是输出Yes,否输出No

第一道tarjan题,求是否为强联通图

#include <queue>
#include <set>
#include <map>

using namespace std;
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define fr freopen("D:\\input.txt","r",stdin)
#define fw freopen("D:\\output.txt","w",stdout)

const int maxn = 10005;
const int maxm = 100005;
struct node
{
int to,pre;
}edge[maxm];
int head[maxn],h=0,dfn[maxn],low[maxn],vis[maxn],st[maxn];
bool vis_stack[maxn];
void addedge(int from,int to)
{
edge[h].to=to;edge[h].pre=head[from];head[from]=h;
}
int num=0,stnum,fri,index,group=0;

void Tarjan(int u)
{
dfn[u]=low[u]=++index;
st[++stnum]=u;
vis_stack[u]=true;
for(int i=head[u];i>-1;i=edge[i].pre)
{
int v=edge[i].to;
if(!vis[v])
{
vis[v]=1;
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else {
if(vis_stack[v]==true)
low[u]=min(low[u],low[v]);
}
}
if(dfn[u]==low[u])
{
group++;
int a,d,l;
do{
a=st[stnum--];
vis_stack[a]=false;
}while(u!=a);
}
}
int main()
{
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
mem(edge,0);mem(head,-1);mem(dfn,0);mem(low,0);mem(vis,0);
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d %d",&a,&b);
addedge(a,b);h++;
}
int flag=0;
stnum=fri=index=group=0;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
vis[i]=1;
Tarjan(i);
if(group>=2) {
flag=1;
break;
}
}
}
printf("%s\n",flag?"No":"Yes");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: