#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
/*
本题应该注意的地方, 输入的行数为n*(n-1)/2;
在按值排序时,应把 建好的排前面, 应为不用发钱了;
*/
int Set[205];
struct node
{
int x, y;
int value;
int flag;
}s[5005];
int n;
int ans;
bool cmp(node p1, node p2) {
if(p1.flag != p2.flag)
return p1.flag > p2.flag;
return p1.value <= p2.value;
}
int Find(int x) {
return x == Set[x] ? x : Set[x] = Find(Set[x]);
}
void Union(int i)
{
int a, b;
a = Find(s[i].x);
b = Find(s[i].y);
if(a != b)
{
Set[a] = b;
if(!s[i].flag)
{
ans += s[i].value;
s[i].flag = 1;
}
}
}
int main()
{
while(scanf("%d", &n) != EOF && n) {
int t = n*(n-1)/2;
for(int i = 0; i < t; i++) {
scanf("%d%d%d%d", &s[i].x, &s[i].y, &s[i].value, &s[i].flag);
}
sort(s, s+t, cmp);
ans = 0;
for(int i = 1; i <= n; i++)
Set[i] = i;
for(int i = 0; i < t; i++)
Union(i);
printf("%d\n", ans);
}
return 0;
}
hdu1879畅通工程
最新推荐文章于 2021-09-23 13:41:44 发布