标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 27389 | Accepted: 9816 |
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!
Source
原题链接:http://poj.org/problem?id=1679
题意:看最小生成树是否唯一,网上看了好多的代码,都用到了枚举,但是发现了一份不用枚举的代码,
原文链接:http://blog.csdn.net/cambridgeacm/article/details/7857252,但是有一点不明白,就是主循环为什么是n次,而不是n-1次。有大神知道吗?
AC代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int INF=0x3f3f3f3f; int a[105][105]; int dis[105]; bool vis[105]; int n,m; void Prime() { for(int i=1; i<=n; i++) { dis[i]=a[1][i]; vis[i]=false; } int ans=0; bool flag=false; for(int i=1; i<=n; i++) { int minn=INF; int p=-1; for(int j=1; j<=n; j++) { if(!vis[j]&&dis[j]<minn) minn=dis[p=j]; } int k=0; for(int j=1; j<=n; j++) { if(vis[j]&&a[p][j]==minn) k++; } if(k>1) { flag=true; break; } vis[p]=1; ans+=minn; for(int j=1; j<=n; j++) { if(!vis[j]&&dis[j]>a[p][j]) dis[j]=a[p][j]; } } if(flag) cout<<"Not Unique!"<<endl; else cout<<ans<<endl; } int main() { int T; freopen("data/1679.txt","r",stdin); cin>>T; while(T--) { cin>>n>>m; for(int i=0; i<=n; i++) { for(int j=0; j<=n; j++) if(i==j) a[i][j]=0; else a[i][j]=INF; } int x,y,z; while(m--) { scanf("%d%d%d",&x,&y,&z); if(z<a[x][y]) a[x][y]=a[y][x]=z; } Prime(); } return 0; }
POJ 1679 The Unique MST【MST是否唯一,Prime算法,最好的代码】
标签:
原文地址:http://blog.csdn.net/hurmishine/article/details/52225465