hdu 1233

并查集的经典做法,计算把路畅通后的最小花费。先把已经畅通的路用并查集归类,再把没畅通的路按花费从小到大排序后逐渐加入根类中。

 

code:

#include <iostream>
#include "algorithm"
using namespace std;
int bin[105];
int n;
struct point
{
    int x;
    int y;
    int z;
};
int find(int x)
{
    if(bin[x]!=x) bin[x]=find(bin[x]);
    return bin[x];
}
void merge(int x,int y,int z,int &p)
{
    int a,b;
    a=find(x);
    b=find(y);
    if(a!=b)
    {
        bin[a]=b;
        p+=z;
    }
    
}
int cmp(point a,point b)
{
    if(a.z<b.z)
    {
        return 1;    
    }
    return 0;
}
int main(int argc, char *argv[])
{
    int n;
    while(scanf("%d",&n)&&n)
    {
        int i;
        for(i=1;i<=n;i++)
        {
            bin[i]=i;    //并查集初始化 
        }
        int max=0;
        point p[5005];
        for(i=1;i<=n*(n-1)/2;i++)
        {
            scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
            //merge(a,b,z,max);
            
        }
        int len=n*(n-1)/2;
        //还要z从小到大排序
        sort(p+1,p+len+1,cmp);
        for(i=1;i<=n*(n-1)/2;i++)
        {
            merge(p[i].x,p[i].y,p[i].z,max);
            
        }
         
        printf("%d\n",max);
    }
    
    return 0;
}

 

你可能感兴趣的:(hdu 1233)