ACM1598并查集方法

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

并查集的伟大力量正等着我们去挖掘,这里再一次让我们脑力激荡。

  1 #include<iostream>
  2 #include<algorithm>
  3 #include<cstring>
  4 using namespace std;
  5 const int oo=11111111;
  6 const int N=220;
  7 class Coor
  8 {
  9     public:
 10     int s,e,speed;//代表线的起始点和终点
 11     friend bool operator<(Coor a,Coor b)
 12     {
 13     return (a.speed<b.speed);//从小到大排序,这样利用贪心算法比较节省时间
 14     }
 15 };
 16 class Comfort
 17 {
 18     public:
 19         Comfort(int n,int m)//构造函数
 20         {
 21             num=n;
 22             side=m;
 23             p=new int[n+1];//临时分配数组空间
 24             edge=new Coor[m+1];
 25         }
 26         ~Comfort()
 27         {
 28             delete []p;
 29             delete []edge;
 30         }
 31
 32         void initp()
 33         {
 34             for(int i=0;i<=num;i++)
 35             p[i]=i;
 36         }
 37         void inputedge()
 38         {
 39             for(int i=0;i<side;i++)
 40             cin>>edge[i].s>>edge[i].e>>edge[i].speed;
 41             sort(edge,edge+side);//排序
 42         }
 43         int find(int x)
 44         {
 45             if(x==p[x])return x;
 46             return p[x]=find(p[x]);//压缩路径
 47         }
 48         void Union(Coor coor)
 49         {
 50             int fa=find(coor.s);
 51             int fb=find(coor.e);
 52             if(fa!=fb)p[fa]=fb;
 53         }
 54         void Dealpart(int q)//以下代码的作用是判断从起点到终点路径想通的最大值和最小值
 55          //详细解释:首先i从零开始,然后下面的循环J从i 开始,在一轮搜索后,应当找到最大值确定的相通路径,若第一轮找不到必然不相通,下面已经处理这样的问题。
 56      //第一轮能够确定最大值后,开始循环直到确定最小值,当起点i不断的向前推进,当推进到起点和终点不连通的时候算是找到了最小值。
 57         {
 58             while(q--)
 59             {
 60                 scanf("%d %d",&start,&end);
 61                 less=oo;
 62                 for(int i=0;i<side;i++)
 63                 {
 64                     initp();
 65                     int temp=oo;
 66                     for(int j=i;j<side;j++)
 67                     {
 68                         Union(edge[j]);//这里每次都连接一个,直到连接到起点终点相通为止,先确定最大值,后确定最小值
 69                         int X=find(start);
 70                         int Y=find(end);
 71                         if(X==Y)
 72                         {
 73                             temp=edge[j].speed-edge[i].speed;
 74                             break;
 75                         }
 76                     }
 77                         if(temp<less)
 78                         less=temp;
 79                         if(less==0)break;//如果less已经为零了就不需要继续循环了,因为没有比他更小的了,节约时间
 80                         if(less==oo)break;//如果在第一轮寻找中都没有找到一个确切的值,那么这两个点是不连通的,所以直接退出循环,节约时间
 81                 }
 82                 if(less==oo)cout<<-1<<endl;
 83                 else cout<<less<<endl;
 84             }
 85         }
 86     private:
 87         int less;
 88         int *p;
 89         int num,side;
 90         Coor *edge;
 91         int start,end;
 92 };
 93 int main()
 94 {
 95     int n,m,Q;
 96     while(cin>>n>>m)
 97     {
 98         Comfort    Object(n,m);
 99         Object.inputedge();
100         cin>>Q;
101         Object.Dealpart(Q);
102     }
103     return 0;
104 }


ACM1598并查集方法,布布扣,bubuko.com

时间: 2024-10-24 16:29:37

ACM1598并查集方法的相关文章

带权并查集

似乎好些天没写文章了,感慨万千啊. 一如既往,先介绍一下题目的需求吧,如下: 题目简述:某人想编写一个字典,该字典中存在正反两种关系,并且这种关系具有某种规则下的传递性质,如下: A 与 B 同义, B 与 C 同义,则 A 与 C同义 : A 与 B 同义, B 与 C 反义,则 A 与 C反义 : A 与 B 反义, B 与 C 同义,则 A 与 C反义 : A 与 B 反义, B 与 C 反义,则 A 与 C同义 . 此人最初定义部分字符串的正反关系,要求以此为基础将所有给定字符串之间的关

利用并查集判断一个无向图是否成树

hdu 1272 利用并查集方法,找到各点的根节点. 几点注意: 一.树:1.无环 2.根节点入度为0,其余入度为1 判断依据: 1.若两个点的根节点相同(这两个点是父子关系),则形成环. 2.若所有点中只有一个点的根节点是他本身,则根节点入度为0. 二. 1. 0 0 :空树也是一颗树. 1 #include<iostream> 2 #include<algorithm> 3 #define Max 100005 4 using namespace std; 5 6 int f[

hdu 1272 小希的迷宫(并查集/附爆栈的原因)

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 33194    Accepted Submission(s): 10214 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该

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

1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1804  Solved: 850[Submit][Status] Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一道题后,才能进入下一题,否则就被淘汰.为了增加节目的趣味性并适当降低难度,主持人总

普林斯顿公开课 算法1-10:并查集-优化的快速合并方法

应用 渗透问题 游戏中会用到. 动态连接 最近共同祖先 等价有限状态机 物理学Hoshen-Kopelman算法:就是对网格中的像素进行分块 Hinley-Milner多态类型推断 Kruskai最小生成树 Fortran等价语句编译 形态学开闭属性 Matlab中关于图像处理的bwlabel函数 渗透问题 一个N×N的矩阵,判断顶部和底部是否连通就是渗透问题. 下图中左侧的矩阵能渗透,右侧矩阵不能渗透. 渗透问题在电学.流体力学.社会交际中都有应用. 在游戏中可能需要生成一张地图,但是作为地图

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

问题描述: 在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(union-find algorithm)定义了两个操作用于此数据结构: Find:确定元素属于哪一个子集.它可以被用来确定两个元素是否属于同一子集: Union:将两个子集合并成同一个集合: 实现并查集的关键是实现union-find algorithm, 本文根据常用的四种算法,实现了这个类,具体算法实现请参看维基百科: 制造测试数据集,

分别利用并查集,DFS和BFS方法求联通块的数量

联通块是指给定n个点,输入a,b(1<=a,b<=n),然后将a,b连接,凡是连接在一起的所有数就是一个联通块: 题意:第一行输入n,m,分别表示有n个数,有输入m对连接点,以下将要输入m行(输入数据到文件截止): 输出:第一行要求输出联通块的个数,并在第二行分别输出每个联通块中点的数量,每个数之间以一个空格隔开. 样例 15 31 42 53 5输出:2 2 3样列2 9 81 22 33 43 74 54 67 87 9输出: 19 如果不明白的话可以画图试试,最多花半个小时,要是早这样不

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

问题描写叙述: 在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(union-find algorithm)定义了两个操作用于此数据结构: Find:确定元素属于哪一个子集.它能够被用来确定两个元素是否属于同一子集: Union:将两个子集合并成同一个集合: 实现并查集的关键是实现union-find algorithm, 本文依据经常使用的四种算法,实现了这个类,详细算法实现请參看维基百科: 制造測试

Is It A Tree?------HDOJ杭电1325(两种方法,可以用也可以不用并查集!!!!!!详解)

Problem Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties. There is exactly one node, called the