hdu 1879 继续畅通工程(最小生成树,prim)

来源:互联网 发布:黄一飞周星驰知乎 编辑:程序博客网 时间:2024/04/28 04:31

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

a,b,权值,flag

为0时未修,1时这条已经修了,所以费用为0;

#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;            }        }    }    return sum;}int main(){    int n,a,b,val,d;    while(scanf("%d",&n)!=EOF&&n){        //memset(graph,0,sizeof(graph));        memset(lowcost,0,sizeof(lowcost));        for(int i=0;i<n*(n-1)/2;i++){            scanf("%d%d%d%d",&a,&b,&val,&d);            if(d)                graph[a][b]=graph[b][a]=0;            else                graph[a][b]=graph[b][a]=val;        }        printf("%d\n",prim(n));    }    return 0;}


阅读全文
0 0
原创粉丝点击