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

    畅通工程

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


    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<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 int per[110],cot,m,n;
     7 struct node
     8 {
     9     int b,e,w;
    10 }s[110];
    11 
    12 bool cmp(node x,node y)
    13 {
    14     return x.w<y.w;
    15 }
    16 
    17 void init()//初始化
    18 {
    19     int i;
    20     for(i=1;i<110;i++)
    21     per[i]=i;
    22 }
    23 
    24 int find(int x)
    25 {
    26     while(x!=per[x])//寻找根节点
    27         x=per[x];
    28     return x;
    29 }
    30 
    31 
    32 bool join (int x,int y)
    33 {
    34     int fx=find(x);
    35     int fy=find(y);
    36     if(fx!=fy)//判断是否构成环
    37     {
    38         per[fx]=fy;
    39         cot++;//记录加了多少边
    40         return true;
    41     }
    42     return false;
    43 }
    44 int main()
    45 {
    46     int i;
    47     while(scanf("%d%d",&m,&n),m)
    48     {
    49         init();
    50         for(i=0;i<m;i++)
    51         scanf("%d%d%d",&s[i].b,&s[i].e,&s[i].w);
    52         sort(s,s+m,cmp);
    53         int sum=0;
    54         cot=0;
    55         for(i=0;i<m;i++)
    56         {
    57             //printf("--- %d %d %d ---
    ",s[i].b,s[i].e,s[i].w);
    58             if(join(s[i].b,s[i].e))
    59             sum+=s[i].w;
    60         }
    61         
    62         if(cot==n-1)//记录边的个数和点的个数比较
    63         printf("%d
    ",sum);
    64         else
    65         printf("?
    ");
    66         
    67     }
    68     return 0;
    69 }

    不明白的欢迎留言!

    下面是prim算法:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define MAX     0x3f3f3f3f
     5 using namespace std;
     6 int m,n;
     7 int map[106][105];//注意一点,必须数组开大点,不然会wa
     8 
     9 int prim()
    10 {
    11     int lowcost[105],min,mark,sum=0,i,j;
    12     
    13     for(i=2;i<=n;i++)
    14     {
    15         lowcost[i]=map[1][i];
    16     }
    17     lowcost[1]=0;//直接当成标记数组
    18     for(i=2;i<=n;i++)
    19     {
    20         min=MAX;
    21         mark=0;
    22         for(j=2;j<=n;j++)
    23         {
    24             if(lowcost[j]<min&&lowcost[j]!=0)
    25             {
    26                 min=lowcost[j];
    27                 mark=j;
    28             }
    29         }
    30         if(min==MAX)
    31         return printf("?
    ");
    32         sum+=min;
    33         lowcost[mark]=0;
    34         for(j=2;j<=n;j++)
    35         {
    36             if(map[mark][j]<lowcost[j])
    37             {
    38                 lowcost[j]=map[mark][j];
    39             }
    40         }
    41     }
    42     return printf("%d
    ",sum);
    43 }
    44 int main()
    45 {
    46     int i,a,b,c;
    47     while(scanf("%d%d",&m,&n),m)
    48     {
    49         memset(map,MAX,sizeof(map));
    50         for(i=1;i<=m;i++)
    51         {
    52             scanf("%d%d%d",&a,&b,&c);
    53             map[a][b]=map[b][a]=c;
    54         }
    55         prim();
    56     }
    57     return 0;
    58 }
  • 相关阅读:
    [设计模式]之二:策略模式
    [设计模式]之一:简单工厂模式
    [iOS] WSHorizontalPickerView 图片水平滚动封装
    [闲谈] 有经验的程序员用Google用得多么?
    Flutter 布局(四)- Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth详解
    Flutter 布局(二)- Padding、Align、Center详解
    Flutter 布局(一)- Container详解
    Flutter 布局详解
    Flutter Plugin开发流程
    现有项目中集成Flutter
  • 原文地址:https://www.cnblogs.com/Eric-keke/p/4720163.html
Copyright © 2011-2022 走看看