思路:求最小生成树(最小生成树就是权值之和最小的极小连通子图) ,注意将已修过的边的权值置为0;
数据结构:由于数据量小,可以用临接矩阵直接存储图
#include<stdio.h> #include<string.h> int vis[101]; int price[101]; int map[101][101]; void init(int n) { int i; memset(vis,0,sizeof(vis)); for(i = 1;i <= n;i ++) price[i] = map[1][i]; } int main() { int i,j,k,n; int min,a,b,c,d,sum; while(~scanf("%d",&n) && n) { sum = 0; for(i = 0;i < (n*(n-1))/2;i ++) { scanf("%d%d%d%d",&a,&b,&c,&d); map[b][a] = map[a][b] = c; if(d) map[b][a] = map[a][b] = 0; } init(n); vis[1] = 1; for(i = 0;i < n;i ++) { k = 0; min = 1 << 30; for(j = 1;j <= n;j ++) { if(!vis[j] && min > price[j]) { min = price[j]; k = j; } } if(min != 1 << 30) sum += min; vis[k] = 1; for(j = 1;j <= n;j ++) { if(!vis[j] && price[j] > map[k][j]) price[j] = map[k][j]; } } printf("%d ",sum); } return 0; }