HDU 1863 畅通工程

一道很朴素的最小生成树,不过通过此题知道了,当n已经决定的情况下,若n个点无法构成最小生成树的话,最终得到ans无法得到精确的值,他会将无穷大的路径加入。

 

#include<stdio.h>
#include<string.h>

const int MAXN=110;
const int INF=9999999;
int mat[MAXN][MAXN];
int vis[MAXN];
int flag;

int Prim(int n)
{
    int lowcost[MAXN];
    int mst[MAXN];
    int i,j,min,minid,sum=0;
    for (i=1;i<=n;i++)
    {
        lowcost[i]=INF;
        vis[i]=0;
        mst[i]=1;
    }
    lowcost[1]=0;
    for (i=1;i<=n;i++)
    {
        min=INF;
        for (j=1;j<=n;j++)
        {
            if(lowcost[j]<min && !vis[j])
            {
                min=lowcost[j];
                minid=j;
            }
        }
        if(min==INF) flag=1;
        sum+=min;
        vis[minid]=1;
        for (j=1;j<=n;j++)
        {
            if(mat[minid][j]<lowcost[j])
            {
                lowcost[j]=mat[minid][j];
                mst[j]=minid;
            }
        }
    }
    return sum;
}

int main()
{
    int n,m,i,j,a,b,c;
    int cas;
    while(scanf("%d%d",&m,&n) && m)
    {
        flag=0;
        cas=0;
        memset(vis,0,sizeof(vis));
        for(i=0;i<=n;i++)
            for (j=0;j<=n;j++)
                mat[i][j]=INF;
            for (i=0;i<m;i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                if(c<mat[a][b]) mat[a][b]=mat[b][a]=c;
            }
        //    printf("%d\n",cas);
            int ans=Prim(n); 
            if(flag) printf("?\n");
            else printf("%d\n",ans);
    }
    return 0;
}
posted @ 2012-07-20 14:41  calmound  阅读(228)  评论(0编辑  收藏  举报