zoukankan      html  css  js  c++  java
  • 洛谷P1111|修复公路|图论|并查集

    问题描述

    题目描述

    思路

    草稿
    并查集水题
    题目的意思就是求最短的图的连通时间。
    由题意可得,修建好的时间一定是输入数据给出的时间中的一个,因为求最小时间,所以将时间排升序。
    之后就是判断一个图是否连通以及增加边的问题的问题:
    并查集:
    对于每个边,判断他们的点是否是一个父亲,不是则连接。
    之后再判断整个图是否连接,即是否共同属于一个父亲。

    代码

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    void read(int &n){
    	int num=0,w=1;
    	char ch=getchar();
    	while(ch<'0'||ch>'9'){
    		if(ch=='-') w=-1;
    		ch=getchar();
    	}
    	while(ch>='0'&&ch<='9'){
    		num=num*10+ch-'0';
    		ch=getchar();
    	}
    	n=num*w;
    }
    const int maxn=100005;
    int n,m,fa[maxn];
    bool ok=0;
    struct node{
    	int a,b,t;
    	bool operator<(const node &x) const {
    		return t<x.t;
    	}
    }e[maxn];
    int dofind(int v){return v==fa[v]?v:fa[v]=dofind(fa[v]);}
    void dounion(int v1,int v2){fa[dofind(v1)]=dofind(v2);}
    void init(){
    	read(n);read(m);
    	for(int i=1;i<=m;i++){
    		read(e[i].a);
    		read(e[i].b);
    		read(e[i].t);
    	}
    	for(int i=1;i<=n;i++) fa[i]=i;
    	sort(e+1,e+1+m);
    }
    bool cheack(){
    	for(int i=2;i<=n;i++)
    		if(dofind(i)!=dofind(i-1)) return 0;
    	return 1;
    }
    void work(){
    	for(int i=1;i<=m;i++){
    		if(dofind(e[i].a)!=dofind(e[i].b)){
    			dounion(e[i].a,e[i].b);
    			if(cheack()){
    				printf("%d",e[i].t);
    				ok=1;
    				break;
    			}
    		}
    	}
    }
    int main(){
    	init();
    	work();
    	if(!ok) printf("-1");
    	return 0;
    }
    

  • 相关阅读:
    dockerfile构建的镜像中文乱码
    xshell+xmanager6破解
    mysql数据库本地登录无法查看到数据库
    Tomcat日志中文乱码问题解决
    Tomcat 启动很慢
    Supervisor-安装
    supervisor-monitor进程集中管理部署
    CeSi 进程集中管理部署
    [IOT]
    [SourceTree]
  • 原文地址:https://www.cnblogs.com/saitoasuka/p/10020741.html
Copyright © 2011-2022 走看看