zoukankan      html  css  js  c++  java
  • 【UOJ 27】丛林中的路

    【题目描述】:

    热带岛屿Lagrishan的首领现在面临一个问题:几年前,一批外援资金被用于维护村落之间的道路,但日益繁茂的丛林无情的侵蚀着村民的道路,导致道路维修开销巨大,长老会不得不放弃部分道路的维护。已经知道了每条路每个月的维修费用(单位为aacms)。现在长老会需要提出一种方案,即需要保证村落之间都可以互相到达,又要将每个月的道路维修费用控制在最小。村子编号为从A到I。上图右侧显示的方案最小维修开销为216 aacms每月。

    【输入描述】:

    输入包含1~50个数据集,最后一行为0.每个数据集第一行为村落数目n, 1 < n < 27,依次用字母表的前n个字母标记。接下来有n-1行,每行的第一个数据便是按字母顺序排列的村子编号(不包括最后一个村庄)。每个村庄后面的数据k代表该村庄通往编号在其之后的村庄的道路数目,如A 2 B 12 I 25,代表A村庄有2个编号在A之后的村庄和其相连。若k大于0,k后面会依次给出这k个村庄的编号以及各自到起始村庄的道路维修费用,如A 2 B 12 I 25,代表A和B之间道路维修费用为12, A和I之间道路维修费用为25(维修费用为不超过100的正整数).路的总数目不超过75条,每个村庄到其他村庄不会有超过15条路(包括编号在其之前和之后的)。

    【输出描述】:

    每个数据集有一个输出:针对解决方案每个月维修道路的小费用。

    提示:蛮力算法虽能找出解决方案,但将会超出时间限制。

    【样例输入】:

    9
    A 2 B 12 I 25
    B 3 C 10 H 40 I 8
    C 2 D 18 G 55
    D 1 E 44
    E 2 F 60 G 38
    F 0
    G 1 H 35
    H 1 I 35
    3
    A 2 B 10 C 40
    B 1 C 20
    0

    【样例输出】:

    216
    30

    【时间限制、数据范围及描述】:

    时间:1s 空间:64M

    题解:emm好困啊,做一道最小生成树就睡觉啦!各位晚安!

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    typedef long long ll;
    using namespace std;
    int n,m,cnt;
    struct node{
        int x;int y;int z;
    }e[1005];
    int fa[1005],v;
    char c,s;
    
    bool cmp(node p,node q){
        return p.z<q.z;
    } 
    
    int find(int x){
        if(fa[x]!=x) 
           fa[x]=find(fa[x]);
        return fa[x];
    }
    
    int main(){
        freopen("27.in","r",stdin);
        freopen("27.out","w",stdout);
        while(1){
            scanf("%d",&n); cnt=0;
            if(n==0) break;
            for(int i=1;i<=n;i++)
                fa[i]=i;
            for(int i=1;i<n;i++){
                //scanf("%c %d",&c,&m);
                cin>>c>>m;
                for(int j=1;j<=m;j++){
                    //scanf("%c %d",&s,&v);
                    cin>>s>>v;
                    e[++cnt].x=c-'A'+1;
                    e[cnt].y=s-'A'+1;
                    e[cnt].z=v;
                }
            }
            sort(e+1,e+cnt+1,cmp);
            int ans=0; int tot=0;
            for(int i=1;i<=cnt;i++){
                int u=find(e[i].x);
                int v=find(e[i].y);
                if(u==v) continue;
                fa[u]=v; ans+=e[i].z; tot++;
                if(tot==(n-1)) break;
            }
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    LeetCode "Jump Game"
    LeetCode "Pow(x,n)"
    LeetCode "Reverse Linked List II"
    LeetCode "Unique Binary Search Trees II"
    LeetCode "Combination Sum II"
    LeetCode "Divide Two Integers"
    LeetCode "First Missing Positive"
    LeetCode "Clone Graph"
    LeetCode "Decode Ways"
    LeetCode "Combinations"
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11456528.html
Copyright © 2011-2022 走看看