• 还是畅通工程--hdu1233


    还是畅通工程

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 32424    Accepted Submission(s): 14588


    Problem Description
    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
    当N为0时,输入结束,该用例不被处理。
     
    Output
    对每个测试用例,在1行里输出最小的公路总长度。
     
    Sample Input
    3
    1 2 1
    1 3 2
    2 3 4
    4
    1 2 1
    1 3 4
    1 4 1
    2 3 3
    2 4 2
    3 4 5
    0
     
     
    Sample Output
    3
    5
     
     
     
    最小生成树!一遍过!
     
     
     
     
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 int per[110],m,n;
     6 void init()
     7 {
     8     int i;
     9     for(i=1;i<110;i++)
    10         per[i]=i;
    11 }
    12 struct node
    13 {
    14     int b,e,w;
    15 }s[6000];
    16 
    17 
    18 bool cmp(node x,node y)
    19 {
    20     return x.w<y.w;
    21 }
    22 
    23 
    24 int find(int x)
    25 {
    26     int t=x;
    27     while(t!=per[t])
    28         t=per[t];//寻找根节点
    29     return t;
    30 }
    31 bool join(int x,int y)
    32 {
    33     int fx=find(x);
    34     int fy=find(y);
    35     if(fx!=fy)
    36     {
    37         per[fx]=fy;
    38         return true;
    39     }
    40     return false;//判断是否成环
    41 }
    42 
    43 int main()
    44 {
    45     int i;
    46     while(scanf("%d",&m),m)
    47     {
    48         
    49         n=m*(m-1)/2;
    50         init();
    51         for(i=0;i<n;i++)
    52             scanf("%d%d%d",&s[i].b,&s[i].e,&s[i].w);
    53             sort(s,s+n,cmp);//对权值排序
    54             int sum=0;
    55             for(i=0;i<n;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             printf("%d
    ",sum);
    62     }
    63     return 0;
    64 }

     下面是prim算法

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define MAX 0x3f3f3f3f
     5 int map[110][110];
     6 int m,n;
     7 int prim()
     8 {
     9     int i,j,lowcost[110],min,mark,sum=0;
    10     for(i=2;i<=n;i++)
    11     lowcost[i]=map[1][i];
    12     lowcost[1]=0;
    13     for(i=2;i<=n;i++)
    14     {
    15         min=MAX;
    16         for(j=2;j<=n;j++)
    17         {
    18             if(lowcost[j]<min&&lowcost[j]!=0)
    19             {
    20                 min=lowcost[j];
    21                 mark=j;
    22             }
    23         }
    24         sum+=min;
    25         lowcost[mark]=0;
    26         for(j=2;j<=n;j++)
    27         {
    28 //            if(map[mark][j]<lowcost[j])
    29 //            lowcost[j]=map[mark][j];
    30             lowcost[j]=map[mark][j]<lowcost[j]?map[mark][j]:lowcost[j];
    31         }
    32     }
    33     return printf("%d
    ",sum);
    34 }
    35 int main()
    36 {
    37     int i,a,b,c;
    38     while(scanf("%d",&n),n)
    39     {
    40         m=n*(n-1)/2;
    41         memset(map,MAX,sizeof(map));
    42         for(i=0;i<m;i++)
    43         {
    44             scanf("%d%d%d",&a,&b,&c);
    45             map[a][b]=map[b][a]=c;
    46         }
    47         prim();
    48     }
    49     return 0;
    50 }
  • 相关阅读:
    Modified Mms.apkDiscontinued till I have free time
    文件管理器 Root Explorer v2.9.4 零售完全版
    QQREADEREFF8B4DFC3E8C03B
    CyanogenMod5 近乎完美的2.1ROM for G1 来了 感谢 cyanogen大神~~
    CyanogenMod5 Would you like a pony? (EXPERIMENTAL) [05/08 v5.0.7test3]
    商业周刊:摩托罗拉下注Android 不成功便成仁
    Cyanogen Updater 5.0 IS HERE!!!
    22个开源的PHP框架
    LotusPhp
    10 个免费超棒的编程用等宽字体
  • 原文地址:https://www.cnblogs.com/Eric-keke/p/4720106.html
Copyright © 2020-2023  润新知