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;
}
诈骗事罢(悲