Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2877762
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-05-09 10:49:19

畅通工程Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8957    Accepted Submission(s): 3471


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

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

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

Sample Input
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
 

Sample Output
3 ?
 

  1. #include<stdio.h>
  2. #include<string.h>
  3. #define MAX 99999

  4. #define LEN 101//这个要注意开大点

  5. int dist[LEN];
  6. int map[LEN][LEN];
  7. int isvisited[LEN];

  8. void init()
  9. {
  10.     int i,j;
  11.     //题目只求1到100 ,LEN :101
  12.     for(i=0;i<LEN;i++)
  13.     {
  14.         for(j=0;j<LEN;j++)
  15.         {
  16.             map[i][j]=MAX;
  17.         }
  18.     }
  19. }

  20. int prim(int n)
  21. {
  22.     int i,j,min,pos,sum;
  23.     sum=0;
  24.     memset(isvisited,0,sizeof(isvisited));
  25.     for(i=1;i<=n;i++)
  26.     {
  27.         dist[i]=map[1][i];//初始化第一个点,将要到达的点距离
  28.     }
  29.     isvisited[1]=1;


  30.     for(i=1;i<n;i++)
  31.     {
  32.         min=MAX;//不要放在外面
  33.         for(j=1;j<=n;j++)
  34.         {
  35.             if(!isvisited[j] && dist[j]<min)//找出相邻将要到达的点(具有最小权值)
  36.             {
  37.                 min=dist[j];
  38.                 pos=j;
  39.             }
  40.         }
  41.         if(min==MAX)
  42.             return -1;//无路可通
  43.         sum+=min;
  44.         isvisited[pos]=1;

  45.         //加入pos点后,更新所有邻接点的权值,(如果有共同的)只交换较小的
  46.         for(j=1;j<=n;j++)
  47.         {
  48.             if(!isvisited[j] && dist[j]>map[pos][j])//pos->j
  49.             {
  50.                 dist[j]=map[pos][j];
  51.             }
  52.         }
  53.     }
  54.     return sum;
  55. }

  56. int main()
  57. {
  58.     
  59.        int n,m;//n道路数(关系数),m村庄数
  60.        while(scanf("%d%d",&n,&m)!=EOF && n)
  61.      {
  62.   
  63.               init();
  64.   
  65.               int i,a,b,w,ans;
  66.   
  67.               for(i=0;i<n;i++)
  68.              {
  69.   
  70.                     scanf("%d%d%d",&a,&b,&w);
  71.                          
  72.                      if(map[a][b]>w)
  73.                      {
  74.   
  75.                             map[a][b]=map[b][a]=w;//对称矩阵
  76.                      }
  77.  
  78.               }
  79.   
  80.               ans=prim(m);
  81.   
  82.               if(ans==-1){
  83.   
  84.                       puts("?");
  85.   
  86.               }
  87.   
  88.               else
  89.              {
  90.                   printf("%d\n",ans);
  91.               }


  92.      }
  93.     return 0;
  94. }

阅读(1044) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~