首页 > 代码库 > hdu 1233 还是畅通工程

hdu 1233 还是畅通工程

题目:

        链接:点击打开链接

题目:

        中文

思路:

算法:

        最小生成树,wa...................wa了好多次,就因为我的边序号原来是从0........m,悲催了...............................

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 5050

int ans,n,m;
int root[MAXN];
int u[MAXN],v[MAXN],w[MAXN];
int r[MAXN];

int cmp(const int i,const int j)
{
    return w[i] < w[j];
}

int find(int x)
{
    return root[x] == x ? x : root[x] = find(root[x]);
}

void kruskal()
{
    ans = 0;
    for(int i=1; i<=n; i++)
        root[i] = i;
    for(int i=1; i<=m; i++)
        r[i] = i;
    sort(r+1,r+m+1,cmp);
    for(int i=1; i<=m; i++)
    {
        int e = r[i];
        int x = find(u[e]);
        int y = find(v[e]);
        if(x != y)
        {
            ans += w[e];
            root[x] = y;
        }
    }
    printf("%d\n",ans);
}

int main()
{
    //freopen("input.txt","r",stdin);
    while(scanf("%d",&n) != EOF && n)
    {
        m = n*(n-1)/2;
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d%d",&u[i],&v[i],&w[i]);
        }
        kruskal();
    }
    return 0;
}