Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 24586 | Accepted: 8743 |
Description
Input
Output
Sample Input
2 3 3 1 2 1 2 3 2 3 1 3 4 4 1 2 2 2 3 2 3 4 2 4 1 2
Sample Output
3 Not Unique! 判断最小生成树的唯一性 ac代码: 最小生成树解法:#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #define MAXN 1010 #define INF 0xfffffff #define max(a,b) a>b?a:b #define min(a,b) a>b?b:a using namespace std; int pri[MAXN][MAXN]; int dis[MAXN]; int v[MAXN]; int sum,n,bz; void prime() { int i,k,M,j,q; memset(v,0,sizeof(v)); for(i=1;i<=n;i++) dis[i]=pri[1][i]; v[1]=1; sum=0; for(i=1;i<n;i++) { M=INF; q=0; for(j=1;j<=n;j++) { if(v[j]==0&&dis[j]<M) { M=dis[j]; k=j; } } for(j=1;j<=n;j++) { if(v[j]&&pri[k][j]==M) { q++; } } v[k]=1; sum+=M; if(q>1) { bz=1; break; } if(M==INF) break; for(j=1;j<=n;j++) { if(v[j]==0&&dis[j]>pri[k][j]) dis[j]=pri[k][j]; } } } int main() { int t,m,i,j,a,b,c; scanf("%d",&t); while(t--) { bz=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) pri[i][j]=pri[j][i]=INF; } for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); if(pri[a][b]>c) pri[a][b]=pri[b][a]=c; } prime(); if(bz) printf("Not Unique!\n"); else printf("%d\n",sum); } return 0; }次小生成树解法:#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #define INF 0xfffffff #define MAXN 550 #define MAX(a,b) a>b?a:b #define MIN(a,b) a>b?b:a using namespace std; int v[MAXN]; int pre[MAXN]; int pri[MAXN][MAXN]; int map[MAXN][MAXN]; int connect[MAXN][MAXN]; int dis[MAXN]; int n; int sum; void prime() { int i,j,k,M; memset(v,0,sizeof(v)); memset(map,0,sizeof(map)); memset(connect,0,sizeof(connect)); sum=0; for(i=1;i<=n;i++) { dis[i]=pri[1][i]; pre[i]=1; } dis[1]=0; v[1]=1; for(i=1;i<n;i++) { M=INF; for(j=1;j<=n;j++) { if(!v[j]&&dis[j]<M) { M=dis[j]; k=j; } } if(M==INF) break; sum+=M; v[k]=1; connect[k][pre[k]]=connect[pre[k]][k]=1; for(j=1;j<=n;j++) if(v[j]&&j!=k) map[j][k]=map[k][j]=MAX(M,map[j][pre[k]]); for(j=1;j<=n;j++) { if(!v[j]&&dis[j]>pri[k][j]) { dis[j]=pri[k][j]; pre[j]=k; } } } } int main() { int t,m; int i,j; int a,b,c; scanf("%d",&t); while(t--) { int bz=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=n;j++) pri[i][j]=INF; for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); pri[a][b]=pri[b][a]=c; } prime(); for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { if(i!=j&&!connect[i][j]&&pri[i][j]==map[i][j]) { bz=1; break; } } } if(bz) printf("Not Unique!\n"); else printf("%d\n",sum); } return 0; }