hdu 1863 畅通工程(MST,prim)

来源:互联网 发布:艾宾浩斯记忆曲线软件 编辑:程序博客网 时间:2024/05/24 07:36

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863

大同小异

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn=110;const int maxcost=99999999;int  graph[maxn][maxn],lowcost[maxn];int prim(int n){    int lowcost[maxn];    int mst[maxn];    int i,j,minn,minid,sum=0;    for(i=2;i<=n;i++){             //lowcost初始化        lowcost[i]=graph[1][i];        mst[i]=1;    }    mst[1]=0;    for(i=2;i<=n;i++){        minn=maxcost;        minid=0;        for(j=2;j<=n;j++){            if(lowcost[j]<minn&&lowcost[j]!=-1){   //上一层已经把找过的赋为-1                minn=lowcost[j];                minid=j;            }        }        if(minn==maxcost)            return -1;        //不连通        //printf("%c - %c : %d\n", mst[minid] + 'A' - 1, minid + 'A' - 1, min);        sum+=minn;        lowcost[minid]=-1;        for(j=2;j<=n;j++){    //找新起点,谁小换谁,相同不换            if(graph[minid][j]<lowcost[j]){                lowcost[j]=graph[minid][j];                mst[j]=minid;   //mst中每一个都是minid,到下次时可以表示起点,然后 - 下一个minid            }        }    }    return sum;}int main(){    int n,m,a,b,val;    while(scanf("%d%d",&n,&m)==2&&n){        fill(graph[0],graph[0]+maxn*maxn,maxcost);        fill(lowcost,lowcost+maxn,maxcost);        for(int i=0;i<n;i++){            scanf("%d%d%d",&a,&b,&val);            graph[a][b]=graph[b][a]=val;        }        int ans=prim(m);        if(ans==-1)            printf("?\n");        else            printf("%d\n",prim(m));    }    return 0;}