POJ-1287【最小生成樹+kruskal算法】
【模板題】
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 100000 + 5
int p[maxn];
// 表示路的結構體
struct edge
{
int u, v, cost;
} roads[maxn];
// 自定義比較函數
bool cmp(edge a, edge b)
{
return a.cost < b.cost;
}
int find(int x)
{
return p[x] == x ? x : p[x] = find(p[x]);
}
int main(int argc, const char **argv)
{
int n, k; // n表示結點數量,k表示路的數量
while (cin >> n && n) // 0代表輸入的結束
{
cin >> k;
for (int i = 0; i < k; i++)
{
cin >> roads[i].u >> roads[i].v >> roads[i].cost;
}
// 對邊按照權值進行排序
sort(roads, roads + k, cmp);
// 對各個結點進行初始化工作
for (int i = 0; i <= n; i++)
p[i] = i;
int ans = 0;
int cnt = 0;
for(int i=0;i<k;i++)
{
int t1 = find(roads[i].u);
int t2 = find(roads[i].v);
if(t1!=t2)
{
ans+=roads[i].cost;
p[t1]=t2;
cnt++;
}
if(cnt==n-1) break;
}
cout<<ans<<endl;
}
return 0;
}
1024打卡