题目大意就是给一个图,判断最小生成树是否唯一。
我用的Prim算法,在找最后一个节点i的时候特殊判断:判断节点i是否有至少2条路距离已找到节点最短距离为x的,如果满足任意一个条件,说明最小生成树不唯一。
题目链接 点击打开链接
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define INF 0xffffff
using namespace std;
int Map[105][105];
int dis[105],pre[105]; //记录每个节点最短路及与之相连的点
int n,m;
void Prim(){
for(int i = 1;i <= n;i++){
dis[i] = Map[i][1];
pre[i] = 1;
}
int ans = 0; //记录最短路总长度
bool flag = false;
for(int l = 1;l < n;l++) {
int Min = INF;
int num = 1;;
for(int i = 1;i <= n;i++){
if(dis[i] != 0 && dis[i] < Min){
Min = dis[i];
num = i;
}
}
if(Min == INF) {
break;
}
ans += Min;
/* int t = 0;
for(int i = 1;i <= n;i++)
if(Map[num][i] == dis[i])
t++;
// if(t > 1){
flag = true;
break;
}*/
if(l == n-1){
int t = 0;
for(int i = 1;i <= n;i++)
if(Map[i][num] == Min && dis[i] == 0)
t++;
if(t > 1) {
flag = true;
break;
}
}
pre[num] = num;
dis[num] = 0;
for(int i = 1;i <= n;i++){
if(dis[i] != 0 && dis[i] > Map[num][i]){
dis[i] = Map[num][i];
pre[i] = num;
}
}
}
if(flag)
printf("Not Unique!\n");
else
printf("%d\n",ans);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
int a,b,c;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++){
if(i == j)
Map[i][j] = 0;
else
Map[i][j] = INF;
}
for(int i = 0;i < m;i++){
scanf("%d%d%d",&a,&b,&c);
Map[a][b] = Map[b][a] = min(Map[a][b],c);
}
Prim();
}
return 0;
}