题目链接:http://poj.org/problem?id=1679
题目意思是判断次小生成树是否唯一。
代码如下:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #include<algorithm> using namespace std; int n, m, map[120][120], max1[120][120], vis[120], maxint=1000000, d[120], stack1[120], pre[1000]; int prim() { int ans=0, pos, i, j, min1, top; for(i=2; i<=n; i++) { d[i]=map[1][i]; pre[i]=1; } memset(max1,0,sizeof(max1)); vis[1]=1; stack1[0]=1; top=1; for(i=1; i<n; i++) { min1=maxint; for(j=2; j<=n; j++) { if(!vis[j]&&min1>d[j]) { min1=d[j]; pos=j; } } vis[pos]=1; ans+=min1; stack1[top++]=pos; for(j=0; j<top; j++) { max1[pos][stack1[j]]=max1[stack1[j]][pos]=max(min1,max1[stack1[j]][pos]); } for(j=2; j<=n; j++) { if(!vis[j]&&map[pos][j]<d[j]) { d[j]=map[pos][j]; pre[j]=pos; } } } return ans; } int main() { int i, j, t, a, b, c, min2, ans; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(vis,0,sizeof(vis)); memset(map,maxint,sizeof(map)); for(i=0; i<m; i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) map[a][b]=map[b][a]=c; } ans=prim(); min2=maxint; for(i=1; i<=n; i++) { for(j=1; j<=n; j++) { if(i!=j&&i!=pre[j]&&j!=pre[i]&&min2>map[i][j]-max1[i][j]) min2=map[i][j]-max1[i][j]; } } if(!min2) printf("Not Unique!\n"); else printf("%d\n",ans); } return 0; }