代码及解释
#include <iostream>
#include <stdio.h>
#include <string.h>
int n,ans;
int imap[110][110],dis[110],vis[110];
inline void Prim() {
int i;
for(i = 1;i <= n; ++i) {
dis[i] = imap[1][i];
vis[i] = 0;
}
dis[1] = 0;
vis[1] = 1;
int j, k = 0, tmp;
for(i = 1; i <= n; ++i) {
tmp = 0x3f3f3f3f;
for(j = 1; j <= n; ++j)
if(!vis[j] && tmp > dis[j]) {
k = j;
tmp = dis[j];
}
if(tmp == 0x3f3f3f3f)
break;
vis[k] = 1;
ans += dis[k];
for(j = 1; j <= n; ++j)
if(!vis[j] && dis[j] > imap[k][j])
dis[j] = imap[k][j];
}
}
int main(){
while(~scanf("%d", &n) && n) {
int ii, jj, temp1, temp2;
for(int i = 0;i < n * (n - 1) / 2; ++i) {
scanf("%d %d", &ii, &jj);
scanf("%d", &temp1);
scanf("%d", &temp2);
if(temp2) {
imap[ii][jj] = imap[jj][ii] = 0;
} else {
imap[ii][jj] = imap[jj][ii] = temp1;
}
}
ans = 0;
Prim();
printf("%d\n", ans);
}
return 0;
}