zoukankan      html  css  js  c++  java
  • 洛谷 P1340 兽径管理

    题目描述

    约翰农场的牛群希望能够在 N 个(1<=N<=200) 草地之间任意移动。草地的编号由 1到 N。草地之间有树林隔开。牛群希望能够选择草地间的路径,使牛群能够从任一 片草地移动到任一片其它草地。 牛群可在路径上双向通行。

    牛群并不能创造路径,但是他们会保有及利用已经发现的野兽所走出来的路径(以 下简称兽径)。每星期他们会选择并管理一些或全部已知的兽径当作通路。

    牛群每星期初会发现一条新的兽径。他们接着必须决定管理哪些兽径来组成该周牛 群移动的通路,使得牛群得以从任一草地移动到任一草地。牛群只能使用当周有被 管理的兽径做为通路。

    牛群希望他们管理的兽径长度和为最小。牛群可以从所有他们知道的所有兽径中挑 选出一些来管理。牛群可以挑选的兽径与它之前是否曾被管理无关。

    兽径决不会是直线,因此连接两片草地之间的不同兽径长度可以不同。 此外虽然 两条兽径或许会相交,但牛群非常的专注,除非交点是在草地内,否则不会在交点 换到另外一条兽径上。

    在每周开始的时候,牛群会描述他们新发现的兽径。如果可能的话,请找出可从任 何一草地通达另一草地的一组需管理的兽径,使其兽径长度和最小。

    输入输出格式

    输入格式:

    输入的第一行包含两个用空白分开的整数 N 和 W。W 代表你的程序需要处理 的周数. (1 <= W <= 6000)。

    以下每处理一周,读入一行数据,代表该周新发现的兽径,由三个以空白分开 的整数分别代表该兽径的两个端点 (两片草地的编号) 与该兽径的长度(1…10000)。一条兽径的两个端点一定不同。

    输出格式:

    每次读入新发现的兽径后,你的程序必须立刻输出一组兽径的长度和,此组兽径可从任何一草地通达另一草地,并使兽径长度和最小。如果不能找到一组可从任一草地通达另一草地的兽径,则输出 “-1”。

    输入输出样例

    输入样例#1:
    4 6	 	 
    1 2 10	 	 
    1 3 8	 	 
    3 2 3	 	 
    1 4 3	 	 
    1 3 6	 	 
    2 1 2	 	 
    
    输出样例#1:
    -1 //No trail connects 4 to the rest of the fields.
    -1 //No trail connects 4 to the rest of the fields.
    -1 //No trail connects 4 to the rest of the fields.
    14 //Maintain 1 4 3, 1 3 8, and 3 2 3.
    12 //Maintain 1 4 3, 1 3 6, and 3 2 3.
    8 //Maintain 1 4 3, 2 1 2, and 3 2 3.
    //program exit	

    最小生成树+插入排序
    所谓插入排序

    点击进入插入排序学习网站
    屠龙宝刀点击就送

    #include <algorithm> 
    #include <cstdio>
    
    #define Max 200
    #define syl main
    using namespace std;
    
    struct node
    {
        int x,y,z;
    }edge[Max*Max*7];
    int cnt,i,j,fa[Max*7],n,w;
    void add(int u,int v,int l)
    {
        node*now=&edge[++cnt];
        now->x=u;
        now->y=v;
        now->z=l; 
    }
    bool cmp(node a,node b)
    {
        return a.z<b.z;
    }
    int find_fa(int k)
    {
        return fa[k]==k?k:fa[k]=find_fa(fa[k]);
    }
    int kruskal()
    {
        for(int i=1;i<=n;++i) fa[i]=i;
        int ans=0,k=0;
        for(int i=1;i<=cnt;++i)
        {
            int fx=find_fa(edge[i].x),fy=find_fa(edge[i].y);
            if(fx!=fy)
            {
                k++;
                fa[fy]=fx;
                ans+=edge[i].z;
                if(k==n-1) return ans;
            }
        }
        return -1;
    }
    void qr(int &x)
    {
        x=0;bool f=0;
        char ch=getchar();
        while(ch>'9'||ch<'0')
        {
            if(ch=='-') f=1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')
        {
            x=x*10+(int)ch-48;
            ch=getchar();
        }
        x=f?(~x)+1:x;
    }
    void InsertSort(int size)
    {
        int i,j,key,fr,t;
        for(i=1;i<size;++i)
        {
            key=edge[i].z;
            fr=edge[i].x;
            t=edge[i].y;
            for(j=i-1;j>=1;--j)
            {
                if(edge[j].z>key) 
                {
                    edge[j+1].z=edge[j].z;
                    edge[j+1].x=edge[j].x;
                    edge[j+1].y=edge[j].y;
                }
                else break;
            }
            edge[j+1].z=key;
            edge[j+1].x=fr;
            edge[j+1].y=t;
        }
    }
    int syl()
    {
        qr(n);qr(w);
        for(int x,y,z;w--;)
        {
            qr(x);qr(y);qr(z);
            add(x,y,z);
            InsertSort(cnt+1);
            printf("%d
    ",kruskal());
        }
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
  • 原文地址:https://www.cnblogs.com/ruojisun/p/6575097.html
Copyright © 2011-2022 走看看