Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 21737 | Accepted: 7692 |
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!
转载请申明原博客地址:http://blog.csdn.net/lionel_d
怎么判断生成树唯一不唯一呢?
只要判断他的次小生成树的总权值与最小生成树的总权值想不想等就可以了,如果相等的话,就说明,最小生成树不唯一,不相等的话,,,自然唯一啦!
次小生成树的求法,就是枚举边,然后再删除边,不断求次小的权值;
具体看博客:http://www.cnblogs.com/hxsyl/p/3290832.html
看代码:
#include <stdio.h> #include <string.h> #define MAX 110 #define INF 1000000000 int graph[MAX][MAX] , max[MAX][MAX]; bool used[MAX][MAX],visited[MAX] ; int prim(int n) { int lowCost[MAX],closest[MAX]; memset(visited,false,sizeof(visited)) ; memset(used,false,sizeof(used)) ; for(int i = 1 ; i <= n ; ++i) { lowCost[i] = graph[1][i] ; closest[i] = 1 ; } visited[1] = true ; int sum=0; for(int i = 0 ; i < n-1 ; ++i) { int min = INF , index = -1 ; for(int j = 1 ; j <= n ; ++j) { if(!visited[j] && min > lowCost[j]) { min = lowCost[j]; index = j ; } } if(index == -1) { break ; } sum += lowCost[index] ; visited[index] = true ; used[index][closest[index]] = used[closest[index]][index] = true ; for(int j = 1 ; j <= n ; ++j) { if(visited[j] && index != j) { max[j][index] = max[index][j] = lowCost[index]>max[j][closest[index]]?lowCost[index]:max[j][closest[index]]; } if(!visited[j] && lowCost[j]>graph[index][j]) { lowCost[j] = graph[index][j] ; closest[j] = index ; } } } return sum ; } int main() { int t ; scanf("%d",&t) ; while(t--) { int n , m; scanf("%d%d",&n,&m) ; for(int i = 0 ; i <= n ; ++i) { graph[i][i] = INF ; for(int j = 0 ; j < i ; ++j) { graph[i][j] = graph[j][i] = INF ; } } for(int i = 0 ; i < m ; ++i) { int xi,yi,wi; scanf("%d%d%d",&xi,&yi,&wi); graph[xi][yi] = graph[yi][xi] = wi ; } int sum = prim(n) , t = INF ; for(int i = 1 ; i <= n ; ++i ) { for(int j = 1 ; j < i ; ++j) { if(!used[i][j] && graph[i][j] != INF) { int r = sum-max[i][j]+graph[i][j]; t = t>r?r:t ; } } } if(sum == t) { puts("Not Unique!") ; } else { printf("%d\n",sum) ; } } return 0 ; }
与君共勉