• hdu 1233(最小生成树 prim算法)


    还是畅通工程

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

    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
    Hint
    Hint
    Huge input, scanf is recommended.
    最小生成树  模版
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<map>
     8 #include<set>
     9 #include<vector>
    10 #include<cstdlib>
    11 #include<string>
    12 #define eps 0.000000001
    13 typedef long long ll;
    14 typedef unsigned long long LL;
    15 using namespace std;
    16 const int N=100+10;
    17 const int INF=0x3f3f3f3f;
    18 int mp[N][N];
    19 int n;
    20 int vis[N];
    21 int dis[N];
    22 int u,v,w;
    23 void prim(){
    24     int ans=0;
    25     memset(vis,0,sizeof(vis));
    26     memset(dis,0,sizeof(dis));
    27     for(int i=1;i<=n;i++)dis[i]=mp[1][i];
    28     vis[1]=1;
    29     for(int i=1;i<=n-1;i++){
    30         int pos;
    31         int minn=INF;
    32         for(int j=1;j<=n;j++){
    33             if(vis[j]==0&&minn>dis[j]){
    34                 pos=j;
    35                 minn=dis[j];
    36             }
    37 
    38         }
    39         vis[pos]=1;
    40         ans=ans+minn;
    41         for(int j=1;j<=n;j++){
    42             if(vis[j]==0&&dis[j]>mp[pos][j])dis[j]=mp[pos][j];
    43         }
    44     }
    45     cout<<ans<<endl;
    46 }
    47 int main(){
    48     while(scanf("%d",&n)!=EOF){
    49         if(n==0)break;
    50         for(int i=1;i<=n;i++)
    51         for(int j=1;j<=n;j++)mp[i][j]=INF;
    52         int m;
    53         if(n%2==0)m=n/2*(n-1);
    54         else
    55             m=(n-1)/2*n;
    56         for(int i=1;i<=m;i++){
    57             scanf("%d%d%d",&u,&v,&w);
    58             mp[u][v]=w;
    59             mp[v][u]=w;
    60         }
    61         prim();
    62     }
    63 }
  • 相关阅读:
    谈To B产品路径逻辑:To B产品的核心本质到底是什么?
    做产品应该遵循哪些宏观产品原则?
    做产品应该遵循哪些微观产品原则?
    B端产品的第一性原理思考
    美团点评王慧文:互联网有AB面,最惨烈战争发生在B2
    《罗振宇 知识就是力量》
    生活是一只龙虾
    CAD-美的热水器F50-32DQ
    CAD-椭圆和圆弧命令
    CAD-圆命令
  • 原文地址:https://www.cnblogs.com/Aa1039510121/p/6463952.html
Copyright © 2020-2023  润新知