http://acm.hdu.edu.cn/showproblem.php?pid=1102
// 是最小產生數的變題,一開始題目沒有看仔細which means the road between village a and village b has been built.
//這句話沒有注意,看題目要仔細啊
#include<iostream>//2242938 2010-03-24 20:03:34 Accepted 1102 31MS 344K 1200 B C++ 悔惜晟
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int s[9591];
struct stu
{
int x;
int y;
int dis;
}df[9591];
int cmp(stu a, stu b)
{
return a.dis < b.dis;
}
int find(int a)
{
int r = a;
while(r != s[r])
r = s[r];
return r;
}
void merge(int a, int b)
{
if(a > b)
s[b] = a;
else
s[a] = b;
}
int main()
{
int N, q, aa[102][102], i , j, n, m, sum;
while(scanf("%d", &N) != EOF)
{
for(i = 1; i <= N; i++)
for(j = 1; j<= N; j++)
scanf("%d", &aa[i][j]);
scanf("%d", &q);
for(i = 0; i < q; i++)
{
scanf("%d%d", &n, &m);
df[i].x = n;
df[i].y = m;
df[i].dis = 0;//這裡表示已經修好了的
aa[n][m] = 0;//一開始這裡寫成aa[i][j] = 0;造成數組越界了
}
for(i = 1 ; i <= N-1; i++)
for(j = i+1; j <=N ; j++)
{
if(aa[i][j] != 0)
{
df[q].x = i;
df[q].y = j;
df[q].dis = aa[i][j];
q++;
}
}
sort(df, df+q, cmp);
sum = 0;
for(i = 1; i <= N; i++)
s[i] = i;
for(i = 0; i < q; i++)
{
int a = find(df[i].x);
int b = find(df[i].y);
if(a != b)
{
sum += df[i].dis;
merge(a, b);
}
}
printf("%d/n", sum);
}
}