Problem Description
在某个公寓里有N位住户,网络服务商(ISP)希望用N-1根网线连接所有这些住户。
不过,住户之间的关系好坏是有差别的,如果用“友好度”来量化一对住户之间的关系,则“友好度”越高表示他们之间关系越好。
现在,网络服务商希望找到一种布线方案,使得所有住户的“友好度”之和最大。
不过,住户之间的关系好坏是有差别的,如果用“友好度”来量化一对住户之间的关系,则“友好度”越高表示他们之间关系越好。
现在,网络服务商希望找到一种布线方案,使得所有住户的“友好度”之和最大。
Input
题目包含多组测试用例,请处理到文件最后。
每组测试用例的第一行仅仅包含一个正整数N(2<=N<=100), 其表示公寓内住户的数量。然后是N行数据,每行包括N个整数,第i行第j列的整数H ij(0<=H ij<=10000)表示第i个住户和第j个住户之间的“友好度”是H ij。
题目数据保证H ij(i!=j) 等于 H ji,并且 H ij(i=j) 等于0.
每组测试用例的第一行仅仅包含一个正整数N(2<=N<=100), 其表示公寓内住户的数量。然后是N行数据,每行包括N个整数,第i行第j列的整数H ij(0<=H ij<=10000)表示第i个住户和第j个住户之间的“友好度”是H ij。
题目数据保证H ij(i!=j) 等于 H ji,并且 H ij(i=j) 等于0.
Output
对于每组测试用例,请输出最大的“友好度”之和。
每组数据输出一行。
每组数据输出一行。
Sample Input
2 0 1 1 0 3 0 1 5 1 0 3 5 3 0
Sample Output
1 8
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 105;
const int M = 105 * 105;
int n, m;
struct A
{
int x, y, z;
bool operator < (const A& b)const
{
return z>b.z;
}
}a[M];
int f[N];
int find(int x)
{
return f[x] == x ? x : f[x] = find(f[x]);
}
int main()
{
while (cin>>n&&n!=0)
{
m = 0;
for (int i = 1; i <= n; ++i)
{
f[i] = i;
for (int j = 1; j <= n; ++j)
{
int x;
cin >> x;
if (i<j)
{
++m;
a[m].x = i;
a[m].y = j;
a[m].z = x;
}
}
}
int ans = 0;
sort(a + 1, a + m + 1);
for (int i = 1; i <= m; ++i)
{
int x = find(a[i].x);
int y = find(a[i].y);
if (x != y)
{
ans += a[i].z;
f[y] = x;
}
}
cout << ans << endl;
}
return 0;
}
#include<algorithm>
using namespace std;
const int N = 105;
const int M = 105 * 105;
int n, m;
struct A
{
int x, y, z;
bool operator < (const A& b)const
{
return z>b.z;
}
}a[M];
int f[N];
int find(int x)
{
return f[x] == x ? x : f[x] = find(f[x]);
}
int main()
{
while (cin>>n&&n!=0)
{
m = 0;
for (int i = 1; i <= n; ++i)
{
f[i] = i;
for (int j = 1; j <= n; ++j)
{
int x;
cin >> x;
if (i<j)
{
++m;
a[m].x = i;
a[m].y = j;
a[m].z = x;
}
}
}
int ans = 0;
sort(a + 1, a + m + 1);
for (int i = 1; i <= m; ++i)
{
int x = find(a[i].x);
int y = find(a[i].y);
if (x != y)
{
ans += a[i].z;
f[y] = x;
}
}
cout << ans << endl;
}
return 0;
}