zoukankan      html  css  js  c++  java
  • 题解 P1111 【修复公路】

    题意翻译:

    求该图已联通时所用最小时间。

    做法:

    最小生成树
    Krusal算法

    1. 先把所有边按修复时间从大到小排序,

    2. 再每次取出权值最小的边,如果它的两个端点$u,v$已经联通了就跳过,

    3. 否则就把这条边加入图中,并且把$u,v$加入到同一个集合中。

    最后,如果取了n-1条边,则说明该图已联通,否则该图不能联通。

    注意:

    所有的路,它们是,同时修的,(第一次做的时候以为一次只能修一条)

    所以我们只需要求最后加入的边用时多少就好了

    完整代码如下

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,prt[1005],m;
    struct road
    {
    	int x,y,time;
    	bool operator < (const road&fuze) const//重载运算符
    	{
    		return time<fuze.time;
    		}
    }a[100005];
    int find(int x)//并查集,查找父节点
    {
    	return x==prt[x]?x:prt[x]=find(prt[x]);
    }
    int main()
    {
    	int cnt=0;
    	cin>>n>>m;
    	for(int i=1;i<=m;i++)
    		cin>>a[i].x >>a[i].y >>a[i].time ; 
    	sort(a+1,a+1+m);//按边权排序
    	for(int i=1;i<=n;i++)
    		prt[i]=i;
    	int ans=-1;
    	for(int i=1;i<=m;i++)
    	{
    		if(find(a[i].x )==find(a[i].y )) continue;
    		cnt++;
    		prt[find(a[i].x ) ]=find(a[i].y ) ;
    		ans=max(ans,a[i].time ); //更新答案
    		 	
    	}
    	if(cnt==n-1)//如果没有取出足够形成树的边
    		cout<<ans<<endl;
    	else 
        	cout<<"-1"<<endl;
    	return 0; 
    }
    
  • 相关阅读:
    过滤textarea
    vue引用jquery
    vue_ajax插件Axios
    VeeValidate
    mongodb
    WEBGL实现--three.js笔记整理
    My SQLworkbench问题总结
    vue遇到的问题
    MYSQL使用笔记
    vue笔记
  • 原文地址:https://www.cnblogs.com/lizinuo/p/10543873.html
Copyright © 2011-2022 走看看