http://acm.hdu.edu.cn/showproblem.php?pid=1233
// 最小產生樹的prim 演算法,一開始知道原理,但是就是不知怎麼把知道的轉換成電腦語言,鑒戒了別人的演算法後才可以寫出
#include<iostream>//2246861 2010-03-25 18:03:27 Accepted 1233 187MS 276K 971 B C++ 悔惜晟
#include<cstdio>
using namespace std;
int const MAX = 10000000;
int link[101];//表示已連接點的位置
int visit[101];//表示一個點沒有串連過
int map[101][101];
int main()
{
int n, i ,j, a, b, dis, sum;
while(scanf("%d", &n) != EOF && n != 0)
{
for( i =1 ; i <= n ;i++)
{
//link[i] = 0;
visit[i] = 1;//表示一個點沒有串連過
for(j = 1; j<= n; j++)
map[i][j] = MAX;
}
for(i = 1; i <= n*(n - 1)/2; i++)
{
scanf("%d%d%d", &a, &b, &dis);
map[a][b] = dis;
map[b][a] = dis;
}
//link[1] = 0;
visit[1] = 0;
link[0] = 1;
int cnt =1;
sum = 0;
while(cnt < n)
{
int min = MAX;
for(i = 0 ;i < cnt ;i++)
for(j = 1; j<= n; j++)
if(visit[j] && map[link[i]][j] < min)
{
min = map[link[i]][j];
//a = j;
link[cnt] = j;
}
//link[cnt] = a;
visit[link[cnt]] = 0;
sum += min;
cnt++;
}
printf("%d/n",sum);
}
}
#include<iostream>//2233542 2010-03-23 11:41:01 Accepted 1233 187MS 320K 789 B C++ 悔惜晟
#include<algorithm>// Kruskal 用於稀疏圖 效率不高,還是有改進
#include<cstdio>
using namespace std;
int tt[4950];//一開始這裡賦值100 越界
struct stu
{
int a;
int b;
int s;
}df[4950];
int cmp(stu a, stu b)
{
return a.s < b.s;
}
int find(int a)
{
int r = a;
while(r != tt[r])
r = tt[r];
return r;
}
void mergy(int a, int b)
{
if(a > b) tt[b] = a;
else tt[a] = b;
}
int main()
{
int i, n, a, b, sum;
while(scanf("%d", &n) != EOF && n != 0)
{
n = n*(n-1)/2;
for(i = 0; i < n; i++)
{
scanf("%d%d%d", &df[i].a, &df[i].b, &df[i].s);
tt[i+1] = i+1;
}
sort(df, df+n, cmp);//先把這裡排序
sum = 0;
for(i = 0; i < n ; i++)
{
a = find(df[i].a);
b = find(df[i].b);
if(a != b)
{
mergy(a, b);
sum +=df[i].s;
}
}
printf("%d/n",sum);
}
}