zoukankan      html  css  js  c++  java
  • 国王的烦恼

    描述

    C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛。两个小岛间可能存在多座

    桥连接。然而,由于海水冲刷,有一些大桥面临着不能使用的危险。如果两个小岛间的所有大桥都不能使用,则这两座小岛就不能

    直接到达了。然而,只要这两座小岛的居民能通过其他的桥或者其他的小岛互相到达,他们就会安然无事。但是,如果前一天两个

    小岛之间还有方法可以到达,后一天却不能到达了,居民们就会一起发起抗议。

    现在C国的国王已经知道了每座桥能使用的天数,超过这个天数就不能使用了。现在他想知道居民们一共会发起多少次抗议。

    输入

      多组测试数据。

      每组数据先输入两个正整数n和m。

      接下来m行,每行三个整数a, b, t,分别表示该座桥连接a号和b号两个小岛,能使用t天。小岛的编号从1开始递增。(1≤n≤

    10000,1≤m≤100000,1<=a,b<=n,1≤t≤100000)

    输出

      输出一个整数,表示居民们发起抗议的次数。

    样例输入

    4 4

    1 2 2

    1 3 2

    2 3 1

    3 4 3

    样例输出

    2

    提示

    对于样例:

    第一天后2和3之间的桥不能使用,不影响。

    第二天后1和2之间,以及1和3之间的桥不能使用,居民们会抗议。

    第三天后3和4之间的桥不能使用,居民们会抗议。

    分析

    其实这题是最大生成树的问题,因为每天各小岛之间的桥的寿命全部减少一天,肯定按桥的寿命从大到小来排序,每次把桥两端的小岛连接起来,若发现这个小岛已经被联通了,就不用再记录此时两个小岛之间桥的寿命了,因为两个小岛之间已经有寿命更长的桥连接了(直接或者间接)。到最后直接统计有多少寿命不同的桥(如果寿命相同,就意味着同一天有多次抗议,然而居民只能一天抗议一次)。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
        int f,t,v;
    } edge[100010];
    bool cmp(node a,node b)
    {
        return a.v>b.v;
    }
    int vest[10005];
    void init(int n)
    {
        for(int i=0; i<=n; i++)
            vest[i]=i;
    }
    int findx(int t)
    {
        if(vest[t]==t)return t;
        return vest[t]=findx(vest[t]);//不小心写成  return findx(vest[t])  结果超时了
    }
    int main()
    {
        int n,m;
        while(~scanf("%d%d",&n,&m))
        {
            init(n);
            for(int i=0; i<m; i++ )
            {
                scanf("%d%d%d",&edge[i].f,&edge[i].t,&edge[i].v);
            }
            sort(edge,edge+m,cmp);
            int sum[100010];
            int k=0;
            for(int i=0; i<m; i++)
            {
                int a=findx(edge[i].f);
                int b=findx(edge[i].t);
                if(a!=b)
                {
                    vest[a]=b;
                    sum[k++]=edge[i].v;
                }
            }
            int cnt=unique(sum,sum+k)-sum;//去重的函数,,方便
           printf("%d
    ",cnt);
        }
        return 0;
    }
  • 相关阅读:
    linux常用命令之--用户与用户组管理命令
    linux常用命令之--文本编辑和文本内容查看命令
    linux常用命令之--目录与文件的操作命令
    linux的文件属性介绍、目录及路径表示方法
    scalatest的userguide
    SBT的用法
    性能工具列表
    ruby不能识别中文的一个坑
    基于Calabash-andriod的UI自动化测试(1)-环境和原理
    scala速成记录1
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/6739045.html
Copyright © 2011-2022 走看看