UVA 11165 - Galactic Travel(BFS+twopointer+并查集)
UVA 11165 - Galactic Travel
题目链接
题意:给定一些不能走的边,要求出从s到t的最短路
思路:由于点数多,直接广搜会超时,所以加上优化,已经找过的点就不在重复找了,这点可以利用并查集进行优化,然后对于每个点的每个不能走的区间,可以先排序,然后利用twopointer的性质,每次可以从上次找到的位置往后找即可
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;const int N = 100005;int t, n, m, parent[N], vis[N];int find(int x) {return x == parent[x] ? x : parent[x] = find(parent[x]);
}struct Ban {int v1, v2;Ban(int v1, int v2) {this->v1 = v1;this->v2 = v2;}
};bool cmp(Ban a, Ban b) {return a.v1 < b.v1;
}vector<Ban> b[N];const int INF = 0x3f3f3f3f;int bfs(int s, int t) {queue<int> Q;Q.push(s);vis[s] = 0;while (!Q.empty()) {int u = Q.front();Q.pop();if (u == t) return vis[u];int v = find(0);int s = 0;while (v < n) {if (v == u) v = find(v + 1);else {int flag = 1;for (int i = s; i < b[u].size(); i++) {if (b[u][i].v1 <= v && b[u][i].v2 >= v) {flag = 0;v = find(b[u][i].v2 + 1);s = i + 1;break;}}if (flag) {vis[v] = vis[u] + 1;Q.push(v);parent[v] = find(v + 1);v = find(v);}}}}return -1;
}int main() {int cas = 0;scanf("%d", &t);while (t--) {scanf("%d%d", &n, &m);for (int i = 0; i <= n; i++) {parent[i] = i;b[i].clear();}int u, v1, v2;while (m--) {scanf("%d%d-%d", &u, &v1, &v2);if (v1 > v2) swap(v1, v2);b[u].push_back(Ban(v1, v2));}for (int i = 0; i < n; i++)sort(b[i].begin(), b[i].end(), cmp);int s, t;scanf("%d%d", &s, &t);printf("Case #%d: ", ++cas);int tmp = bfs(s, t);if (tmp == -1) printf("Impossible\n");else printf("%d\n", tmp);}return 0;
}
UVA 11165 - Galactic Travel(BFS+twopointer+并查集)相关推荐
- LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)
文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 2.3 并查集 1. 题目 给定一组 N 人(编号为 1, 2, -, N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢 ...
- 小花梨判连通(DFS或BFS或并查集+vector+map)——“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)
(https://acm.ecnu.edu.cn/contest/173/problem/C/) 题目大意: 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于每个点? ...
- LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)
文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 2.3 并查集 1. 题目 用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1. 线缆用 connection ...
- 第 254 场力扣周赛(KMP、贪心、快速幂、二分+多源bfs、并查集 + 时光倒流)
第 254 场力扣周赛 稀里糊涂双眼双眼惺忪的做了三道,错了4次...还是600来名 5843. 作为子字符串出现在单词中的字符串数目 题目描述 给你一个字符串数组 patterns 和一个字符串 w ...
- L2-026 小字辈——BFS DFS 并查集-三种方法
输入格式: 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) -- 简单起见,我们把家族成员从 1 到 N 编号.随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的 ...
- HDU - 5441 Travel 离线处理+并查集
题意 给我们一个图 给出这个图的n个点 和m个边和权值 然后再分别给我们q个查询 每个查询给一个x 让我们在这个图中找出多少个不同的有序对 使得从x到y的最大权值不超过x n≤20000,m≤1000 ...
- HDU5441 Travel 有秩并查集
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others) ...
- 【CodeForces - 616C】The Labyrinth(bfs,并查集,STLset)
题干: 求每个*能够到达的格子数量,只有.可以走(四个方向扩展),结果mod 10,替换 * 后输出. Input The first line contains two integers n, m ...
- HDU1181:变形课(并查集 + DFS + BFS)
变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submissi ...
最新文章
- 2022-02-07
- python 分析两组数据的差异_R语言limma包差异基因分析(两组或两组以上)
- AjaxPost、冒泡示例
- leetcode695:DFS 岛屿最大面积(C语言)
- window snmp服务开启及测试
- linux 查询 lib信息,linux系统信息常用查询命令
- python做var模型_【Python金融量化】VaR系列(五):Copula模型估计组合VaR
- 苹果无人车四个最新专利:手势控制变道、车辆导流、路况感知及车辆控制
- Android JSON 数据解析 之原生 API
- IDEA 切换黑色主题
- 计算机软件系统管理说课,计算机软件系统 说课稿
- 算法复杂度和合并果子题解
- 手机打电话的通讯原理
- Buffer基本使用
- 马哥教育SRE笔记【作业】week05
- 搭建SSH,SSZ架构需注意数据库的编码问题
- ES 索引创建及查询
- python 读写h5py文件(转载)
- 大数据要学什么?看看这份大数据课程大纲
- 军工科研质量管理软件全面支持GJB5000A