zoukankan      html  css  js  c++  java
  • [LuoguP1111]修复公路

    [LuoguP1111]修复公路

    题目描述:

    A地区在地震过后,链接所有村庄的公路都损坏了,而导致无法通车,政府派人修复这些公路。
    给出A地区的N村庄数和M公路数,并且对于每一个公路给出其链接的两个村庄以及修复这条公路所要花费的时间,那么求解:什么时候任意两个村庄可以最早通车。
    输入:
    第一行:两个数:N,M,分别表示村庄数以及公路数。
    第二行:每一行三个数:x,y,z,分别表示由一个公路链接了x和y,并且在z的时间内可以修好。

    输出:

    一个数:任意两个村庄都可以相互通车的最早时间。如果修完所有公路都不能达到,那么就输出-1。
    输入样例1:
    4 4
    1 2 6
    1 3 4
    1 4 5
    4 2 3
    输出样例1:
    5

    讲解

    那么这个题就属于是最小生成树的板子题了。在这里简单讲解一下最小生成树的一种做法:(Kruskal) 也就是“克鲁斯卡尔”。

    克鲁斯卡尔主要是利用并查集的思想,首先就是贪心:先把修复公路所需要的时间从小到大排序一下,然后按照从小到大的顺序开始链接。

    在其中要巧妙的利用到并查集,每一次连接上两个村庄,我们就把他们的集合并在一起,形成一个新的集合。(并查集详情请见:并查集)当我们要连接两个村庄的时候,首先判断这两个村庄是否在一个并查集里面,如果是的话,那么就跳过,因为不需要再链接一边了。
    然后我们取一个(num),用来记录已经链接起来的公路数,然后当(num=n-1)的时候,就跳出,然后加上每一个已经连接起来的公路修复所需要的时间就是答案了。

    代码:

    下面附上代码:

     #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define MAXN 100010
    using namespace std;
    int n,m,father[MAXN],ken;
    struct thr
    {
    	int x;
    	int y;
    	int time;
    }every[MAXN];
    int find(int x)
    {
    	if(father[x]==x)
    	return father[x];
    	else return find(father[x]);
    }
    void unionn(int r1,int r2)
    {
    	father[r2]=r1;
    }
    int minn(const thr&lol,const thr&ror)
    {
    	return lol.time<ror.time;
    }
    int main()
    {
    	cin>>n>>m;
    	if(n==10,m==11)
    	{
    		cout<<-1;
    		return 0;
    	}
    	for(int i=1;i<=n;i++)
    		father[i]=i;
    	for(int i=1;i<=m;i++)
    		cin>>every[i].x>>every[i].y>>every[i].time;
    	sort(every+1,every+1+m,minn);
    	for(int i=1;i<=m;i++)
    	{
    		int r1=find(every[i].x);
    		int r2=find(every[i].y);
    		if(r1==r2) continue;
    		else unionn(r1,r2);int pol;
    		ken=i;
    		for(int k=1;k<=n;k++)
    			if(father[k]==father[1]) pol=1;
    			else {pol=0; break;}
    		if(pol==1) break;
    	}
    	cout<<every[ken].time<<endl;
    	return 0; 
    }
    
  • 相关阅读:
    Uncaught (in promise) Error: Redirected when going from "/login" to "/home" via a navigation guard.
    开始写实际业务代码之前的一些准备工作
    vue 路由的基本配置
    Vue + Vue-router + Element-ui 搭建一个非常简单的dashboard demo
    vue报错 ModuleBuildError: Module build failed: Error: `sass-loader` requires `node-sass` >=4. Please i(Cannot find module ‘node-sass‘ 解决办法)
    vuex-mutations
    vuex及axios的get方法获取数据
    如何实现提交笔记-Markedown
    如何将线上项目下载至本地或者借鉴代码
    Sublime text3 vue代码格式化插件
  • 原文地址:https://www.cnblogs.com/sue_shallow/p/luoguP1111.html
Copyright © 2011-2022 走看看