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;//访问过则有环,答案设为0if (!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;
}
诈骗事罢(悲