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; 
    }
    
  • 相关阅读:
    poj 3616 Milking Time
    poj 3176 Cow Bowling
    poj 2229 Sumsets
    poj 2385 Apple Catching
    poj 3280 Cheapest Palindrome
    hdu 1530 Maximum Clique
    hdu 1102 Constructing Roads
    codeforces 592B The Monster and the Squirrel
    CDOJ 1221 Ancient Go
    hdu 1151 Air Raid(二分图最小路径覆盖)
  • 原文地址:https://www.cnblogs.com/sue_shallow/p/luoguP1111.html
Copyright © 2011-2022 走看看