字节跳动校招内推码: C4BDSMC
投递链接: https://job.toutiao.com/s/J691fRK
内推交流QQ群:1049175720
Think:
1知识点:判断一个连通无向图的最小生成树是否是唯一的+最小生成树_Prim算法+记录路径
2题意:给定一个连通无向图,判断这个连通无向图的最小生成树是否是唯一的
3错误反思:
4思路:
1>思路1:第一遍Prim算法求出路径最小权值和且记录路径,然后逐一试探删掉一条记录的路径之后图是否连通,若图连通则判断当前状态最小生成树最小边权和是否和之前的最小权值和相等,逐一遍历完成后若无最小边权和等于第一遍Prim算法求出的最小权值和,则说明最小生成树唯一,反之则说明最小生成树不唯一
2>思路2:通过Kruskal算法构建最小生成树,第一次构建时标记构建边,之后类似思路1逐一试探每一条边的影响,若存在次小生成树最小权值和等于最小生成树权值和则说明最小生成树不唯一,反之则说明最小生成树唯一
以下为Wrong Answer代码——思路1Prim算法——暂未找到错误所在
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 114;
struct Edge{
int u, v, w;
}link[5014];
int tp, vis[N], dis[N], path[N], e[N][N];
void Prim(int n);
int main(){
int T, n, m, i, u, v, w;
scanf("%d", &T);
while(T--){
scanf("%d %d", &n, &m);
memset(e, inf, sizeof(e));
for(i = 0; i < n; i++){
scanf("%d %d %d", &u, &v, &w);
if(w < e[u][v])
e[u][v] = e[v][u] = w;
}
Prim(n);
}
return 0;
}
void Prim(int n){
int i, miv, v, num, ans, sum;
memset(vis, 0, sizeof(vis));
for(i = 1; i <= n; i++){
dis[i] = e[1][i];
path[i] = 1;
}
vis[1] = 1, dis[1] = 0, num = 1, sum = 0;
tp = 0;
while(num <