hdu1879
来源:互联网 发布:香蕉地 c语言视频下载 编辑:程序博客网 时间:2024/06/05 18:12
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int _max = 0x3f3f3f3f;const int maxn = 111;int map[maxn][maxn];bool visit[maxn];int dist[maxn];int n;void prim(){ int sum1 = 0; for(int i = 1; i <= n; i++) dist[i] = map[1][i]; dist[1] = 0; visit[1] = true; for(int i = 1; i < n; i++) { int min = _max; int k; for(int j = 1; j <= n; j++) { if(!visit[j] && min > dist[j]) { min = dist[j]; k = j; } } visit[k] = true; sum1 += min; for(int j = 1; j <= n; j++) if(!visit[j] && dist[j] > map[k][j]) dist[j] = map[k][j]; } printf("%d\n", sum1);}int main(){ while(scanf("%d", &n)!=EOF&&n) { for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) map[i][j] = _max; for(int i = 0; i < n*(n-1)/2; i++) { int u, v, w, x; scanf("%d%d%d%d", &u, &v, &w, &x); if(x==1) map[u][v] = map[v][u] = 0; else map[u][v] = map[v][u] = w; } memset(visit, false, sizeof(visit)); prim(); }}