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;

}

你可能感兴趣的:(HDU)