国王的烦恼

描述

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之间的桥不能使用,居民们会抗议。

package com.Major;

import java.util.*;
public class Main{
    static HashSet<Integer> f=new HashSet<Integer>();
    static List<Integer> x=new ArrayList<Integer>();
    static int n=0;
    public static void main(String vgs[]) throws Exception{
        Scanner sn=new Scanner(System.in);
        String line=sn.nextLine();
        n=Integer.valueOf(line.split(" ")[0]);

        int m=Integer.valueOf(line.split(" ")[1]);
        List<Brg> brg=new ArrayList<Brg>();
        for(int i=0;i<m;i++){
            String[] str=sn.nextLine().split(" ");
            int a=Integer.valueOf(str[0]);
            int b=Integer.valueOf(str[1]);
            int date=Integer.valueOf(str[2]);
            Brg bg=new Brg(a,b,date);
            brg.add(bg);
        }
        x.add(1);//从第一个岛开始取
        while(x.size()<n){//判断是否所有小岛都已经取到
            Prim(brg,x);
        }
        System.out.println(f.size());
    }

    public static void Prim(List<Brg> brg,List<Integer> a){
        int d=0;
        int n=0;
        Brg bbb=new Brg();
        //按最大边提取岛   从编号为1的岛开始取,从这个岛与别的联通的岛中,取出桥存在时间最长的那个岛x
        //把这个岛x放入岛的集合a中,同时brg中去掉已经去掉的岛,重复,直到所有的岛都取出来为止
        for(int i=0;i<a.size();i++){
            for(Brg brg1:brg){
                if(brg1.getA()==a.get(i)){
                    if(d<brg1.getDate()){
                        n=brg1.getB();
                        d=brg1.getDate();
                        bbb=brg1;
                    }
                }else if(brg1.getB()==a.get(i)){
                    if(d<brg1.getDate()){
                        n=brg1.getA();
                        d=brg1.getDate();
                        bbb=brg1;
                    }
                }
            }
        }
        //判断是否取到值(存在小岛)
        if(d!=0){
            brg.remove(bbb);
            f.add(d);
            x.add(n);
        }
    }
}

class Brg{
    private int a;
    private int b;
    private int date;
    public Brg(int a,int b,int date){
        this.a=a;
        this.b=b;
        this.date=date;
    }
    public Brg() {
        // TODO Auto-generated constructor stub
    }
    public void setA(int a){
        this.a=a;
    }
    public int getA(){
        return this.a;
    }
    public void setB(int b){
        this.b=b;
    }
    public int getB(){
        return this.b;
    }
    public void setDate(int date){
        this.date=date;
    }
    public int getDate(){
        return this.date;
    }
}

我使用的是prim算法,但是提交结果是TimeLimitExceeded,暂时没想到优化方案。

时间: 2024-08-29 15:20:32

国王的烦恼的相关文章

nyoj925_国王的烦恼_并查集

国王的烦恼 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能存在多座桥连接.然而,由于海水冲刷,有一些大桥面临着不能使用的危险.如果两个小岛间的所有大桥都不能使用,则这两座小岛就不能直接到达了.然而,只要这两座小岛的居民能通过其他的桥或者其他的小岛互相到达,他们就会安然无事.但是,如果前一天两个小岛之间还有方法可以到达,后一天却不能到达了,居民们就会一起发起抗议

NYOJ 题目925 国王的烦恼(最小生成树变形)

国王的烦恼 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能存在多座桥连接.然而,由于海水冲刷,有一些大桥面临着不能使用的危险.如果两个小岛间的所有大桥都不能使用,则这两座小岛就不能直接到达了.然而,只要这两座小岛的居民能通过其他的桥或者其他的小岛互相到达,他们就会安然无事.但是,如果前一天两个小岛之间还有方法可以到达,后一天却不能到达了,居民们就会一起发起抗议

nyoj 925 国王的烦恼(最小生成树)

1 /* 2 题意:N个城市中每两个城市有多条路径连接,可是因为路径存在的天数是有限的!以为某条路经不存在了 3 导致N个城市不能连通了,那么村名们就会抗议!问一共会有多少次抗议! 4 5 思路:最小生成树....我们用最大边来建立树!只要有最大边将节点连接并保证连通!那么边权小的值 6 就可以忽略了!最后将生成树中由(最大边组成的)去重(相同的值只有一次抗议)!这时剩下边的数值就是 7 答案了! 8 */ 9 #include<iostream> 10 #include<cstring

历届试题 国王的烦恼

问题描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能存在多座桥连接.然而,由于海水冲刷,有一些大桥面临着不能使用的危险. 如果两个小岛间的所有大桥都不能使用,则这两座小岛就不能直接到达了.然而,只要这两座小岛的居民能通过其他的桥或者其他的小岛互相到达,他们就会安然无事.但是,如果前一天两个小岛之间还有方法可以到达,后一天却不能到达了,居民们就会一起抗议. 现在C国的国王已经知道了每座桥能使用的天数,超过这个天数就不能使用了.现在他想

NYOJ 925 国王的烦恼

从最后一天开始往前加边. 同一天的边同时加到图上,加完之后检查集合数量是否和没加之前有变化. 有变化的话,答案就+1. #include<cstdio> #include <iostream> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; const in

瓜皮的佳木斯集训Day1

T1:"疲劳"传说 炉石传说:魔兽英雄传是一款由暴雪开发的非常流行的游戏.这个问题建立在这个游戏的基础上,但是即使你不知道这个游戏,你也能非常轻松的解决这个问题. 每一局游戏是两个对手1v1的比赛.炉石传说的游戏方式是回合制,每个玩家轮流打出自己手中的牌. 每个玩家可以选择一个"英雄",一个魔兽争霸中的重要人物.每个英雄有它独特的英雄技能.每个英雄有30滴血,并且如果他的血量减少到0 以下(包括0),英雄就会死亡.控制他的玩家就输掉了游戏. 在回合开始,玩家需要从他

算法-蓝桥杯习题(七)

蓝桥杯习题 蓝桥杯练习系统习题加答案,总共分为6部分,90%习题使用C语言解答,部分使用C++或者Java.大部分习题为搜索参考或者别人提供所得,不足之处在所难免,恳请批评指正(预计200多题,习题仅供学习交流) 目录 算法训练(详见 算法-蓝桥杯习题(一))Go 算法训练(详见 算法-蓝桥杯习题(二))Go 算法提高(waiting...) 历届试题(详见 算法-蓝桥杯习题(六))Go 历届试题(详见 算法-蓝桥杯习题(七))Go 蓝桥杯练习系统评测数据 链接: http://pan.baid

蓝桥杯 历届试题 题目总结

后天就是蓝桥杯省赛了,今天总结一下这段时间做的蓝桥杯历届试题,还是一个一个题目的来吧!!!!!! 1,历届试题 矩阵翻硬币 这个题目说真的,我不会,在网上看了某神牛的题解答案为 ans=sqrt(n)*sqrt(m),具体怎么证明的我也不知道 2,历届试题 兰顿蚂蚁 这个题目怎么说呢,应该是送分题,直接模拟就可以了,这里就不说了. 3, 历届试题 分糖果 这个题目好像之前在哪里做过,也是一道模拟题,弄两个数组搞一下就可以了 下面是代码 #include<bits/stdc++.h> using

BZOJ1935: [Shoi2007]Tree 园丁的烦恼

1935: [Shoi2007]Tree 园丁的烦恼 Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: "最近我在思索一个问题,如果我们把花坛摆成六个六角形,那么--" "那么本质上它是一个深度优先搜索,陛下",园丁深深地向国王鞠了一躬. "嗯--我听说有一种怪物叫九头蛇,它非常贪吃苹果树--" &