POJ-1287【最小生成樹+kruskal算法】

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打卡

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章