• 题解 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; 
    }
    
  • 相关阅读:
    如何在OS X 10.9 Mavericks下安装Command Line Tools(命令行工具)
    NGUI系列教程六(技能冷却的CD效果)
    NGUI系列教程五(角色信息跟随)
    NGUI系列教程四(自定义Atlas,Font)
    NGUI系列教程三
    NGUI系列教程二
    NGUI系列教程一
    相机控制
    Visual Stuio 2010 常用快捷及操作
    unity3d 使用背景贴图
  • 原文地址:https://www.cnblogs.com/lizinuo/p/10543873.html
Copyright © 2020-2023  润新知