HDU1598 find the most comfortable road 【并查集】+【枚举】
find the most comfortable road
但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
第一行有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, 表示寻路的起终点。
4 4
1 2 2
2 3 4
1 4 1
3 4 2
2
1 3
1 2
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\n", 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\n");
else printf("%d\n", ans); }
}
return 0;
}
HDU1598 find the most comfortable road 【并查集】+【枚举】的更多相关文章
- hdu 1598 find the most comfortable road (并查集+枚举)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1598 find the most comfortable road Time Limit: 1000/ ...
- HDU 1598 find the most comfortable road 并查集+贪心
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1598 find the most comfortable road Time Limit: 1000 ...
- hdu 1598 find the most comfortable road (并查集)
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 最舒适的路(并查集+枚举)(hdu1598)
hdu1598 find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768 ...
- hdu1598 find the most comfortable road (枚举)+【并查集】
<题目链接> 题目大意: XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在 ...
- hdu 1598 find the most comfortable road(并查集+枚举)
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDU-1598 find the most comfortable road
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- [HDU1598]find the most comfortable road
思路: 考虑一个暴力:枚举最大的边权和最小的边权,然后将边权在这之间的边全拿出来构成一张无向图,剩下的就是判断是否存在一条从$S$到$T$的路径.相当于判$S$和$T$是否连通,用并查集连一下即可.时 ...
- hdu-5861 Road(并查集)
题目链接: Road Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Pro ...
随机推荐
- 分享如何将git项目导入GitHub(附创建分支)
前言:我们应该很多都会有自己的私有项目,大多情况都是存放在自己的硬盘中,今天我分享一下怎么讲自己的私有项目更新到GitHub上,这样再也不用担心项目丢失了. 一:下载git 下载链接git链接,根据自 ...
- ASP.NET Core 异常处理与日志记录
1. ASP.NET Core 异常处理与日志记录 1.1. 异常处理 1.1.1. 异常产生的原因及处理 1.1.2. ASP.NET Core中启动开发人员异常页面 1.2. 日志记录 1.2.1 ...
- Python返回Json格式定义的例子
{ "code": 0, // code为0表示成功,否则为1 "message": null, "data": { "syscp ...
- Python源码分析
- 【O】VSS 2005上传PDF文件之后,打开提示文件损坏或者内容为空
问题: VSS 2005上传PDF文件之后,打开提示文件损坏或者内容为空: 解决方式: 在vss的客户端的tools-option中,file type选项卡里,在binary file文本框中,加入 ...
- python变量命名规则
在Python中使用变量时,需要遵守一些规则和指南.违反这些规则将引发错误,而指南旨在让你编写的代码更容易阅读和理解.请务必牢记下述有关变量的规则. 变量名只能包含字母.数字和下划线.变量名可以字 ...
- Django 入门案例开发(下)——创建项目应用及模型类
前面两章是在已经开发好的项目上用来描述环境和业务,这一章创建一个全新的项目来用作开发,你可以跟着我的步骤进行开发,如果有不理解的地方可以给我留言. 今天的任务是创建好项目和用户(users)应用及让它 ...
- mysql数据库表卡死解决方法
---恢复内容开始--- 问题引起原因: 由于在执行大量插入操作的时候意外终止程序之后, MySQl的线程并没有被终止,导致表不能打开和操作 - 解决思路就是找到等待的线程并kill -- 查看所有 ...
- 静态频繁子图挖掘算法用于动态网络——gSpan算法研究
摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的 ...
- EXTtreeGrid分页
这个东西整了两天,关键在于要两个stroe,之所以要两个因为treestroe在分页的时候接受不了返回的总行数,不过有个问题就是第二页分页后显示在没有根节点的行层级显示不是那木明显: -------- ...