P8881 懂事时理解原神 黄 题解

Never gonna give you up↑Never gonna let you down↓

思路

先看到题面中的 DFS 最短路伪代码,可发现,每个结点的 \(dis\) 值只会被能够到它的仅一条路径更新,若存在多条路径(\(>1\) 条)可以到达该点的时候 DFS 将会出错。而因为是无向图,所以只有图中存在环的时候才会出错,所以本题就转化为了在图中判环,若有环输出 \(0.000\) 否则输出 \(1.000\)

代码

#include <bits/stdc++.h>
using namespace std;

int t,n,m,ans;
vector<int> g[50010];
bool vis[50010];

void dfs (int u,int fa) {
	vis[u]=1;//标记已经走过
	for (auto v: g[u]) {
		if (v==fa) continue;
		if (!vis[v]) dfs (v,u);//没访问过代表无环,继续递归
		else ans=0;//访问过则有环,答案设为0
		if (!ans) return ;//如果已经有环,退出递归
	}
}

int main () {
	cin>> t;
	while (t--) {
		cin>> n>> m;
		ans=1;//答案初值设为1,代表默认无环
		for (int i=1;i<=n;i++) {
			vis[i]=0;
			g[i].clear ();
		}//多测清空
		for (int i=1;i<=m;i++) {
			int u,v;
			cin>> u>> v;
			g[u].push_back (v);
			g[v].push_back (u);
		}
		dfs (1,0);//DFS搜索判环
		cout<< ans<< ".000\n";
	}
	return 0;
}

诈骗事罢(悲

posted @ 2025-03-04 20:40  M_CI  阅读(21)  评论(0)    收藏  举报