P8881 懂事时理解原神 黄 题解

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

思路

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

诈骗事罢(悲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值