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

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

【模板题】

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

你可能感兴趣的:(-,-【图论】-【最小生成树】)