zoukankan      html  css  js  c++  java
  • 畅通工程 HDOJ--1863

    畅通工程

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


    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
      1 #include<stdio.h>
      2 #include<string.h>
      3 int father[105],depth[105];
      4 int dist[105],map[101][101];
      5 int vis[105],n;
      6 void init_B()
      7 {
      8     int i;
      9     for(i = 1;i <= n;i ++)
     10     {
     11         father[i] = i;
     12         depth[i] = 0;
     13     }
     14 }
     15 
     16 int find(int x)
     17 {
     18     if(x == father[x])
     19         return x;
     20     return father[x] = find(father[x]);
     21 }
     22 
     23 void unit(int x,int y)
     24 {
     25     x = find(x);
     26     y = find(y);
     27     if(x == y)
     28         return ;
     29     if(depth[x] < depth[y])
     30         father[x] = y;
     31     else
     32     {
     33         if(depth[x] > depth[y])
     34             father[y] = x;
     35         else
     36         {
     37             father[x] = y;
     38             depth[y]++;
     39         }
     40     }
     41 }
     42 
     43 void init()
     44 {
     45     int i;
     46     memset(vis,0,sizeof(vis));
     47     for(i = 1;i <= n;i ++)
     48         dist[i] = map[1][i];
     49 }
     50 
     51 int main()
     52 {
     53     int m,i,j,k,a,b;
     54     int min,cnt,cost,sum;
     55     while(~scanf("%d%d",&m,&n) && m)
     56     {
     57         init_B();
     58         sum = cnt = 0;
     59         for(i = 1;i <= n;i ++)
     60         {
     61             for(j = 1;j <= n;j ++)
     62             {
     63                 if(i != j)
     64                 {
     65                     map[i][j] = 1 << 30;
     66                 }
     67             }
     68         }
     69         while(m--)
     70         {
     71             scanf("%d%d%d",&a,&b,&cost);
     72             map[a][b] = map[b][a] = cost;
     73             unit(a,b);
     74         }
     75         init();
     76         for(i = 1;i <= n;i ++)
     77         {
     78             if(i == find(i))
     79                 cnt++;
     80             if(cnt == 2)
     81                 break ;
     82         }
     83         if(cnt == 2)
     84         {
     85             printf("?
    ");
     86             continue ;
     87         }
     88         for(i = 0;i < n;i ++)
     89         {
     90             min = 1 << 30;
     91             for(j = 1;j <= n;j ++)
     92             {
     93                 if(!vis[j] && min > dist[j])
     94                 {
     95                     min = dist[j];
     96                     k = j;
     97                 }
     98             }
     99             vis[k] = 1;
    100             if(min != 1 << 30)
    101                 sum += min;
    102             for(j = 1;j <= n;j ++)
    103             {
    104                 if(!vis[j] && dist[j] > map[k][j])
    105                     dist[j] = map[k][j];
    106             }
    107         }
    108         printf("%d
    ",sum);
    109     }
    110     return 0;
    111 }
     
    Sample Output
    3 ?
  • 相关阅读:
    MATLAB数据处理快速学习教程
    dev -c++ 快捷键
    SQL 通配符
    如何利用SQL语句求日期的时间差值,并汇总网上的一些信息
    matlab使用常犯的错误
    matlab中将矩阵按照行打乱顺序的一个例子
    我所认识的PCA算法的princomp函数与经历 (基于matlab)
    java 读取本地的json文件
    Oracle数据库——SQL基本查询
    Oracle数据库——表的创建与管理
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3376409.html
Copyright © 2011-2022 走看看