1005 ProblemE

来源:互联网 发布:触摸屏手写软件 编辑:程序博客网 时间:2024/05/16 14:02

题意:
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。当N为0时输入结束。
思路:
最小生成树,如果是联通的成本就是0,如果不联通成本就是他给的那个树,prim和kruskal都行,我感觉prim简单点 就用的prim。

#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>using namespace std;#define inf 0x3f3f3f3fint map[100][100];int s[100],vis[100];int n,m;int prim(){    int i,j,t,p,min,cnt,minpos;    int ans=0;    cnt=0;    vis[1]=1;    s[cnt++]=1;    while(cin>>n&&n)    {        t=cnt;        min=inf;        for(i=0;i<t;i++)        {            p=s[i];            for(j=1;j<=n;j++)            {                if(!vis[j]&&map[p][j]<min)                {                    min=map[p][j];                    minpos=j;                }            }        }        ans+=min;        s[cnt++]=minpos;        vis[minpos]=1;    }    return ans;}int main(){    int i,sum;    while(cin>>n&&n)    {        memset(vis,0,sizeof(vis));        memset(map,inf,sizeof(map));        int b,c,d,sta;        m=n*(n-1)/2;        for(i=0;i<m;i++)        {            cin>>b>>c>>d>>sta;            if(sta==0)                map[b][c]=map[c][b]=d;            else                map[b][c]=map[c][b]=0;        }        sum=prim();        cout<<sum<<endl;    }    return 0;}
0 0
原创粉丝点击