hdu 1102 Constructing Roads

//最小生成树裸题,稠密图,用prim实现不用kruskal

#include <stdio.h>
#include <string.h>
#define MAX 110
#define INF 1000*100+10
int g[MAX][MAX];
int n,m;
int lowcoat[MAX],adj[MAX];

void Prim()
{
    int i,j,k,min,ans;
    for(i=1; i<=n; i++)
        lowcoat[i]=g[1][i] , adj[i]=1;
    lowcoat[1]=0;

    for(i=1; i<n; i++)
    {
        min=INF; k=1;
        for(j=1; j<=n; j++)
            if( lowcoat[j] && lowcoat[j] < min)
                min=lowcoat[j] , k=j;
        lowcoat[k]=0;

        for(j=1; j<=n; j++)
            if( lowcoat[j] && lowcoat[j] > g[k][j])
                lowcoat[j]=g[k][j] , adj[j]=k;
    }

    for(ans=0 , i=1; i<=n; i++)
        if(g[i][j=adj[i]]!=-1) 
            ans+=g[i][j]; 

    printf("%d\n",ans);

    return ;
}

int main()
{
    int i,j,a,b;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
                scanf("%d",&g[i][j]);

        scanf("%d",&m);
        for(i=1; i<=m; i++)
        {
            scanf("%d%d",&a,&b);
            g[a][b]=g[b][a]=-1;  //不能改为0,会导致算法出错,仔细想想即可
        }
/*
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
                printf("%d ",g[i][j]);
            printf("\n");
        }
*/
        Prim();
    }
    return 0;
}
posted @ 2012-10-15 17:40  Titanium  阅读(164)  评论(0编辑  收藏  举报