畅通工程(最小生成树) hdu acm 1863 c++

来源:互联网 发布:淘宝实体店叫什么 编辑:程序博客网 时间:2024/06/06 15:22

畅通工程

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 17334    Accepted Submission(s): 7300


Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
 

Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
 

Sample Input
3 31 2 11 3 22 3 41 32 3 20 100
 

Sample Output
3?
 
思路:prim算法,最小生成树,用模板就可以过;
参考代码:
#include<cstdio>#include<cstring>#define MIN 999999999int point[110][110],dist[110],flag[110];int prim(int m){     int i,j,k,min,sum;     dist[1]=0;     for(i=1;i<=m;i++)     {         min=MIN;         for(j=1;j<=m;j++)            if(!flag[j]&&min>dist[j])            {               min=dist[j];               k=j;            }         flag[k]=1;         for(j=1;j<=m;j++)         {              if(!flag[j]&&dist[j]>point[k][j])                  dist[j]=point[k][j];         }     }     sum=0;     for(i=1;i<=m;i++)     {         if(dist[i]>=MIN)              break;         sum+=dist[i];          }     if(i<=m)         return -1;     else         return sum;    }int main(){    int i,j,n,m,a,b,p,s;        while(scanf("%d%d",&n,&m),n)    {        memset(flag,0,sizeof(flag));        for(i=0;i<=m;i++)        {            dist[i]=MIN;            for(j=0;j<=m;j++)               if(i==j)                   point[i][j]=0;               else                   point[i][j]=MIN;            }        while(n--)        {            scanf("%d%d%d",&a,&b,&p);            if(point[a][b]>p)                point[a][b]=point[b][a]=p;        }        s=prim(m);        if(s==-1)            printf("?\n");        else            printf("%d\n",s);                }    return 0;}



0 0
原创粉丝点击