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

 

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

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


AC代码:

#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;
}

 

全部评论

相关推荐

牛客60022193...:大厂都招前端,他们觉得AI能替代前端,可能他们公司吊打btaj吧
点赞 评论 收藏
分享
11-28 16:00
已编辑
武汉理工大学 Java
想干测开的tomca...:这份简历是“短期项目硬堆中大型系统技术”的“技术炫技式造假模板”,槽点密集到能当反面教材: ### 1. 「项目时长」和「技术密度」严重脱节,造假痕迹焊死在简历上 两个项目时长分别是**3个月、2个月**,但堆了Spring AI、Elasticsearch、MinIO、Kafka、ShardingSphere、Docker、Sentinel等近20个中大型项目才用的技术——正常情况下,光把这些中间件的文档看完+环境搭好,3个月都不够,更别说实现“AI多轮对话、分库分表、RBAC权限、大模型调用”这些功能。 说白了:你这不是“做项目”,是把“后端技术栈清单”往项目里硬塞,明摆着“只调用了API,没碰过核心逻辑”。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务