题意:判断最小生成树是否唯一。
可以通过求次小生成树解决,如果相等则说明不唯一。
#include<cstring> #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<string> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 110; const int INF = 0x3f3f3f3f; int cost[MAXN][MAXN]; bool vis[MAXN]; int lowc[MAXN]; int pre[MAXN]; int Max[MAXN][MAXN]; bool used[MAXN][MAXN]; int Prim(int cost[][MAXN], int n){ int ans = 0; memset(vis, false, sizeof(vis)); memset(Max, 0, sizeof(Max)); memset(used, false, sizeof(used)); vis[0] = true; pre[0] = -1; for(int i = 1; i < n; i++){ lowc[i] = cost[0][i]; pre[i] = 0; } lowc[0] = 0; for(int i = 1; i < n; i++){ int minc = INF; int p = -1; for(int j = 0; j < n; j++){ if(!vis[j] && minc>lowc[j]){ minc = lowc[j]; p = j; } } if(minc == INF)return -1; ans += minc; vis[p] = true; used[p][pre[p]] = used[pre[p]][p] = true; for(int j = 0; j < n; j++){ if(vis[j]) Max[j][p] = Max[p][j] = max(Max[j][pre[p]], lowc[p]); if(!vis[j] && lowc[j]>cost[p][j]){ lowc[j] = cost[p][j]; pre[j] = p; } } } return ans; } int ans; int smst(int cost[][MAXN],int n){ int Min = INF; for(int i = 0; i < n; i++) for(int j = i+1; j < n; j++) if(cost[i][j]!=INF && !used[i][j]){ Min = min(Min, ans+cost[i][j]-Max[i][j]); } if(Min == INF) return -1; return Min; } int main(){ // freopen("a.txt", "r", stdin); int t,m,n; cin >> t; while(t--){ scanf("%d%d", &n, &m); memset(cost, 0x3f, sizeof(cost)); int a, b, c; for(int i = 0; i < m; i++){ scanf("%d %d %d", &a, &b, &c); a--; b--; cost[a][b] = cost[b][a] = c; } ans = Prim(cost, n); int ci = smst(cost, n); if(ans != ci) cout << ans << endl; else cout << "Not Unique!" <<endl; } return 0; }