http://acm.hdu.edu.cn/showproblem.php?pid=1102

最简单的最小生成树

View Code
#include <stdio.h>
#include <stdlib.h> 
#include <math.h> 
int p[110];
int cnt,n; 
typedef struct L
{
    int a,b,d; 
}L;
L r[10000];     
int cmp(const void*a,const void*b)
{
    return (*(struct L*)a).d-(*(struct L*)b).d; 
} 
int find(int x){return p[x]==x?x:p[x]=find(p[x]);} 
int Kruskal()
{
    int ans=0; 
    int x,y,i; 
    for(i=0;i<n;i++)p[i]=i; 
    qsort(r,cnt,sizeof(L),cmp);
    for(i=0;i<cnt;i++)
    {
        x=find(r[i].a);
        y=find(r[i].b);
        if(x!=y){ans+=r[i].d;p[x]=y;} 
    }
    return ans; 
}
int main()
{
    int i,j;
    int Q,a,b; 
    int x[110][110]; 
    while(~scanf("%d",&n))
    {
        cnt=0; 
        for(i=0;i<n;i++)
            for(j=0;j<n;j++) 
                scanf("%d",&x[i][j]);
        for(i=0;i<n;i++)
            for(j=i+1;j<n;j++)
            { 
                r[cnt].a=i;
                r[cnt].b=j;
                r[cnt++].d=x[i][j];
            } 
        scanf("%d",&Q); 
        for(i=0;i<Q;i++)
        {
            scanf("%d%d",&a,&b);
            for(j=0;j<cnt;j++)
                if((r[j].a==a-1&&r[j].b==b-1)) 
                {
                    r[j].d=0;
                    break;
                }
        } 
        printf("%d\n",Kruskal()); 
    }
    return 0;
}