zoukankan      html  css  js  c++  java
  • HDU1598 find the most comfortable road 【并查集】+【枚举】

    find the most comfortable road

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 3686    Accepted Submission(s): 1565


    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
    题意:求联通路中的最小速度差。

    题解:先按边权从小到大排序,再用并查集枚举。

    2014-11-2 22:38:14更新

    /*
    ** 用并查集每次选择一些权值最接近的边组合使得源点跟终点联通
    */
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    
    #define maxn 210
    #define maxm 1010
    #define inf 0x3f3f3f3f
    
    int pre[maxn], id;
    struct Node {
    	int u, v, w;
    } E[maxm];
    
    int min(int a, int b) {
    	return a < b ?

    a : b; } bool cmp(Node a, Node b) { return a.w > b.w; } int ufind(int k) { int a = k, b; while(pre[k]) k = pre[k]; while(a != k) { b = pre[a]; pre[a] = k; a = b; } return k; } bool same(int a, int b) { return ufind(a) == ufind(b); } void unite(int a, int b) { a = ufind(a); b = ufind(b); if(a != b) pre[a] = b; } void addEdge(int u, int v, int w) { E[id].u = u; E[id].v = v; E[id++].w = w; } int main() { int n, m, i, a, b, c, j, q, ans; while(scanf("%d%d", &n, &m) == 2) { for(i = id = 0; i < m; ++i) { scanf("%d%d%d", &a, &b, &c); addEdge(a, b, c); } std::sort(E, E + m, cmp); scanf("%d", &q); while(q--) { scanf("%d%d", &a, &b); ans = inf; for(i = 0; i < m; ++i) { memset(pre, 0, sizeof(int) * (n + 1)); for(j = i; j < m; ++j) { unite(E[j].u, E[j].v); if(same(a, b)) { ans = min(ans, E[i].w - E[j].w); break; } } if(ans == inf) break; // cut } if(ans == inf) ans = -1; printf("%d ", ans); } } return 0; }



    #include <stdio.h>
    #include <string.h>
    #include <limits.h>
    #include <algorithm>
    #define maxn 202
    #define maxm 1002
    using std::sort;
    using std::min;
    
    int pre[maxn];
    struct Node{
    	int u, v, cost;
    } E[maxm];
    
    int ufind(int k)
    {
    	int a = k, b;
    	while(pre[k] != -1) k = pre[k];
    	while(a != k){
    		b = pre[a];
    		pre[a] = k;
    		a = b;
    	}
    	return k;
    }
    
    bool cmp(Node a, Node b){
    	return a.cost < b.cost;
    }
    
    int main()
    {
    	int n, m, q, a, b, i, j, x, y, ans;
    	while(scanf("%d%d", &n, &m) == 2){
    		for(i = 0; i < m; ++i)
    			scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].cost);
    		sort(E, E + m, cmp);
    		scanf("%d", &q);
    		while(q--){
    			scanf("%d%d", &a, &b);
    			ans = INT_MAX;
    			for(i = 0; i < m; ++i){
    				memset(pre, -1, sizeof(pre));
    				for(j = i; j < m; ++j){
    					x = ufind(E[j].u);
    					y = ufind(E[j].v);
    					if(x != y) pre[x] = y;
    					if(ufind(a) == ufind(b)){
    						ans = min(ans, E[j].cost - E[i].cost);
    						break;
    					}
    				}
    			}
    			if(ans == INT_MAX) printf("-1
    ");
    			else printf("%d
    ", ans);
    			
    		}
    	}
    	return 0;
    }


  • 相关阅读:
    project3 blockchain
    RESTful Web服务与“大”Web服务: 做出正确的建筑决策
    project2
    LAB4
    云计算的描述性文献综述与分类研究
    SQL常见面试题(学生表_课程表_成绩表_教师表)
    等价类划分经典实例-三角形测试用例设计
    搜索框功能测试分析
    B/S结构-登录页面-测试用例设计
    软件测试面试--常用基本控件测试用例
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7079552.html
Copyright © 2011-2022 走看看