前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDU 1269 迷宫城堡(强连通图)

HDU 1269 迷宫城堡(强连通图)

作者头像
Ch_Zaqdt
发布2019-03-06 09:39:19
4370
发布2019-03-06 09:39:19
举报
文章被收录于专栏:Zaqdt_ACMZaqdt_ACM

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269

       一道判断强连通图的裸题,强连通图就是图中任意两点之间可以相互到达,直接用tarjan写就好了,直接求强连通分量,等于1就是Yes。


AC代码:

代码语言:javascript
复制
#include <bits/stdc++.h>
#define maxn 10005
#define maxm 100005
using namespace std;
struct Node{
	int to,next;
}Edge[maxm];
int head[maxn], num;
int dfn[maxn], low[maxn], cnt;
bool vis[maxn], flag;
int n, m, tot;

void init(){
	for(int i=0;i<=n;i++){
		low[i] = dfn[i] = 0;
		head[i] = -1;
		vis[i] = false;
	}
	flag = true;
	num = cnt = tot = 0;
}

void add(int u,int v){
	Edge[num].to = v;
	Edge[num].next = head[u];
	head[u] = num ++;
}

void tarjan(int x){
	dfn[x] = low[x] = ++ cnt;
	vis[x] = true;
	for(int i=head[x];i!=-1;i=Edge[i].next){
		int to = Edge[i].to;
		if(!dfn[to]){
			tarjan(to);
			low[x] = min(low[x], low[to]);
		}
		else if(vis[to]){
			low[x] = min(low[x], dfn[to]);
		}
	}
	if(low[x] == dfn[x]){
		tot ++;
	}
}

int main()
{
	while(~scanf("%d%d",&n,&m)){
		if(n == 0 && m == 0) break;
		init();
		for(int i=0;i<m;i++){
			int u, v;
			scanf("%d%d",&u, &v);
			add(u, v);
		}
		for(int i=1;i<=n;i++){
			if(!dfn[i]) tarjan(i);
		}
		if(tot == 1) puts("Yes");
		else puts("No");
	}
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年02月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档