find the most comfortable road

Problem Description
XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ),
但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
 
Input
输入包括多个测试实例,每个实例包括:
第一行有2个正整数n (1<n<=200)和m (m<=1000),表示有N个城市和M条SARS。
接下来的行是三个正整数StartCity,EndCity,speed,表示从表面上看StartCity到EndCity,限速为speedSARS。speed<=1000000
然后是一个正整数Q(Q<11),表示寻路的个数。
接下来Q行每行有2个正整数Start,End, 表示寻路的起终点。
 
Output
每个寻路要求打印一行,仅输出一个非负整数表示最佳路线的舒适度最高速与最低速的差。如果起点和终点不能到达,那么输出-1。
 
Sample Input
4 4
1 2 2
2 3 4
1 4 1
3 4 2
2
1 3
1 2
 
Sample Output
1
0
 
并查集的伟大力量正等着我们去挖掘,这里再一次让我们脑力激荡。 
 #include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int oo=;
const int N=;
class Coor
{
public:
int s,e,speed;//代表线的起始点和终点
friend bool operator<(Coor a,Coor b)
{
return (a.speed<b.speed);//从小到大排序,这样利用贪心算法比较节省时间
}
};
class Comfort
{
public:
Comfort(int n,int m)//构造函数
{
num=n;
side=m;
p=new int[n+];//临时分配数组空间
edge=new Coor[m+];
}
~Comfort()
{
delete []p;
delete []edge;
} void initp()
{
for(int i=;i<=num;i++)
p[i]=i;
}
void inputedge()
{
for(int i=;i<side;i++)
cin>>edge[i].s>>edge[i].e>>edge[i].speed;
sort(edge,edge+side);//排序
}
int find(int x)
{
if(x==p[x])return x;
return p[x]=find(p[x]);//压缩路径
}
void Union(Coor coor)
{
int fa=find(coor.s);
int fb=find(coor.e);
if(fa!=fb)p[fa]=fb;
}
void Dealpart(int q)//以下代码的作用是判断从起点到终点路径想通的最大值和最小值
 //详细解释:首先i从零开始,然后下面的循环J从i 开始,在一轮搜索后,应当找到最大值确定的相通路径,若第一轮找不到必然不相通,下面已经处理这样的问题。
     //第一轮能够确定最大值后,开始循环直到确定最小值,当起点i不断的向前推进,当推进到起点和终点不连通的时候算是找到了最小值。
{
while(q--)
{
scanf("%d %d",&start,&end);
less=oo;
for(int i=;i<side;i++)
{
initp();
int temp=oo;
for(int j=i;j<side;j++)
{
Union(edge[j]);//这里每次都连接一个,直到连接到起点终点相通为止,先确定最大值,后确定最小值
int X=find(start);
int Y=find(end);
if(X==Y)
{
temp=edge[j].speed-edge[i].speed;
break;
}
}
if(temp<less)
less=temp;
if(less==)break;//如果less已经为零了就不需要继续循环了,因为没有比他更小的了,节约时间
if(less==oo)break;//如果在第一轮寻找中都没有找到一个确切的值,那么这两个点是不连通的,所以直接退出循环,节约时间
}
if(less==oo)cout<<-<<endl;
else cout<<less<<endl;
}
}
private:
int less;
int *p;
int num,side;
Coor *edge;
int start,end;
};
int main()
{
int n,m,Q;
while(cin>>n>>m)
{
Comfort Object(n,m);
Object.inputedge();
cin>>Q;
Object.Dealpart(Q);
}
return ;
}


ACM1598并查集方法的更多相关文章

  1. C. Glass Carving (CF Round #296 (Div. 2) STL--set的运用 &amp;&amp; 并查集方法)

    C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  2. 判断图连通的三种方法——dfs,bfs,并查集

    Description 如果无向图G每对顶点v和w都有从v到w的路径,那么称无向图G是连通的.现在给定一张无向图,判断它是否是连通的. Input 第一行有2个整数n和m(0 < n,m < ...

  3. bzoj 1191: [HNOI2006]超级英雄Hero 并查集 || 匈牙利算法

    1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1804  Solved: 850[Submit][S ...

  4. Supermarket(贪心/并查集)

    题目链接 原创的博客 题意: 超市里有N个商品. 第i个商品必须在保质期(第di天)之前卖掉, 若卖掉可让超市获得pi的利润. 每天只能卖一个商品. 现在你要让超市获得最大的利润. n , p[i], ...

  5. #C++初学记录(奶酪#并查集)

    原题目:牛客网 题目描述 : 现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞.我们可以在这块奶酪中建立空间坐标系, 在坐标系中,奶酪的下表面为 ...

  6. JZOJ5966【NOIP2018提高组D2T3】保卫王国(并查集)

    题目 还是懒得把题目放上来了. 大意:给你一棵带点权的树,你要花费一些代价选择一些点使得相邻的两个点至少有一个被选. 然后有很多个询问,每个询问强制两个点的状态,问强制了这两个点的状态后的方案. 比赛 ...

  7. 并查集算法Union-Find的思想、实现以及应用

    并查集算法,也叫Union-Find算法,主要用于解决图论中的动态连通性问题. Union-Find算法类 这里直接给出并查集算法类UnionFind.class,如下: /** * Union-Fi ...

  8. 并查集类的c++封装,比較union_find algorithm四种实现方法之间的性能区别

    问题描写叙述: 在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(union-find algorithm ...

  9. 判断无向图是否有环路的方法 -并查集 -BFS

    可以利用并查集或者带颜色标记的BFS(来自算法导论)判断. 首先介绍第一种,用并查集来判断: 首先初始化所有元素的根为-1,-1代表根节点,接下来对于图中的每一条边(v1,v2)都并入集合,并入的方式 ...

随机推荐

  1. Aizu - 2249

    注意先保证距离最短,再来判断价格 邻接矩阵回朝内存  ,要用邻接表的 #include<bits/stdc++.h> using namespace std; #define inf 0x ...

  2. 从零开始的Python学习Episode 4——列表

    一.列表 列表与数组相似,定义一个列表 a=[1,2,3,4,5] 1.基本操作 a=[1,2,3,4] #切片 范围取值时,包括第一项但不包括最后一项,顾头不顾尾 print(a[0:]) #从头到 ...

  3. ArrayList与LinkedList的普通for循环遍历

    对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: public static void main(String[] ...

  4. codeforces 301D Yaroslav and Divisors(树状数组)

    Yaroslav has an array p = p1, p2, ..., pn (1 ≤ pi ≤ n), consisting of n distinct integers. Also, he ...

  5. 2018-8-29安装Jitamin过程实录

    2018-8-29安装Jitamin过程实录 新建 模板 小书匠 欢迎走进zozo的学习之旅. 简介 安装 nginx + php + mysql 安装composer 安装Jitamin 简介 在考 ...

  6. DAY2敏捷冲刺

    站立式会议 工作安排 (1)服务器配置 (2)数据库连接 (3)页面创意 燃尽图 代码提交记录 感想 林一心:centos配置服务器真的算是一个不小的坑,目前数据库配置清楚,脚本部署好明天测试交互,还 ...

  7. Where to go from here

    Did you get through all of that content? Congratulations! You've learnt the fundamentals of algorith ...

  8. PHP利用pcntl_exec突破disable_functions

    http://fuck.0day5.com/?p=563 PHP突破Disable_functions执行Linux命令 利用dl函数突破disable_functions执行命令 http://ww ...

  9. Django学习笔记---第一天

    Django学习笔记 1.Django的安装 //如果不指定版本号,默认安装最新版 pip3 install django==1.11.8 关于Django的版本和python的版本依赖关系,请看下图 ...

  10. 个人github blog环境设置

    每个人都想拥有自己的网站,但是大部分比较屌丝,不想花钱租赁服务器,哈哈,屌丝有屌丝办法.github应该都听说过吧,github.io提供了此功能,而且使用github来管理自己的代码,如果你有域名, ...