csu 1307 City Tour dijkstra+并查集 最短路 解题报告
2016-08-25 15:09
579 查看
Description
Alice想要从城市A出发到城市B,由于Alice最近比较穷(不像集训队陈兴老师是个rich second),所以只能选择做火车从A到B。不过Alice很讨厌坐火车,火车上人比较多,比较拥挤,所以Alice有很严格的要求:火车的相邻两站间的最大距离尽可能的短,这样Alice就可以在停站的时候下车休息一下。当然Alice希望整个旅途比较短。
Input
有多组测试数据。
每组测试数据的第一行有两个整数N,M,A,B(N<=2000, M<=50000, N >=2, A,B<=N),其中N是城市的个数,M是城市间通火车的个数。
A,B是Alice起始的城市与目的地城市,城市的标号从1开始。
接下来的M行每行三个整数u,v,w表示从u到v和从v到u有一条铁路,距离为w, u,v<=N, w<=10000。
Output
对于每组测试数据输出满足Alice要求的从A到B的最短距离。
Sample Input
Sample Output
思路:
首先按边从小到大排序,类似kruskal建树,直到s与t点在同一个联通分量,范围当前边的最大值,因为已经排序了,所以当前边即是最大。
上一步求得了s到t相邻最小的最大,然后用dijkstra求小于这条边的最短路,即可。
代码:
Alice想要从城市A出发到城市B,由于Alice最近比较穷(不像集训队陈兴老师是个rich second),所以只能选择做火车从A到B。不过Alice很讨厌坐火车,火车上人比较多,比较拥挤,所以Alice有很严格的要求:火车的相邻两站间的最大距离尽可能的短,这样Alice就可以在停站的时候下车休息一下。当然Alice希望整个旅途比较短。
Input
有多组测试数据。
每组测试数据的第一行有两个整数N,M,A,B(N<=2000, M<=50000, N >=2, A,B<=N),其中N是城市的个数,M是城市间通火车的个数。
A,B是Alice起始的城市与目的地城市,城市的标号从1开始。
接下来的M行每行三个整数u,v,w表示从u到v和从v到u有一条铁路,距离为w, u,v<=N, w<=10000。
Output
对于每组测试数据输出满足Alice要求的从A到B的最短距离。
Sample Input
3 3 1 2 1 2 80 1 3 40 2 3 50 3 3 1 2 1 2 90 1 3 10 2 3 20 4 5 1 4 1 2 8 1 4 9 1 3 10 2 4 7 3 4 8
Sample Output
90 30 15
思路:
首先按边从小到大排序,类似kruskal建树,直到s与t点在同一个联通分量,范围当前边的最大值,因为已经排序了,所以当前边即是最大。
上一步求得了s到t相邻最小的最大,然后用dijkstra求小于这条边的最短路,即可。
代码:
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #define MAXN 2020 #define MAXM 55000 #define INF 0x3f3f3f3f using namespace std; struct node { int x, y, v; }w[MAXM * 2]; int f[MAXN], n, m, s, t, maxE; int dis[MAXN], map[MAXN][MAXN], vis[MAXN]; int cmp(node a, node b) { return a.v < b.v; } int find(int x) { return f[x] == x ? x : (f[x] = find(f[x])); } int cal() { int me = 0; for(int i = 1; i <= n; i++) f[i] = i; sort(w, w + m, cmp); for(int i = 0; i < m; i++) { int x = find(w[i].x); int y = find(w[i].y); if(x != y) { f[x] = y; me = max(me, w[i].v); if(find(s) == find(t)) { return me; } } } return me; } int dijkstra() { memset(vis, 0, sizeof(vis)); memset(dis, 0x3f, sizeof(dis)); for(int i = 1; i <= n; i++) { if(map[s][i] > maxE) continue; dis[i] = map[s][i]; } vis[s] = 1; dis[s] = 0; while(true) { int k = -1, mixv = INF; for(int i = 1; i <= n; i++) { if(!vis[i] && mixv > dis[i]) { k = i; mixv = dis[i]; } } if(k == -1) break; vis[k] = 1; for(int i = 1; i <= n; i++) { if(!vis[i] && (dis[i] > dis[k] + map[k][i]) && map[k][i] <= maxE) { dis[i] = dis[k] + map[k][i]; } } } /*for(int i = 1; i <= n; i++) { printf("%d ", dis[i]); } printf("\n");*/ return dis[t]; } int main() { while(scanf("%d%d%d%d", &n, &m, &s, &t) != EOF) { memset(map, 0x3f, sizeof(map)); for(int i = 0; i < m; i++) { scanf("%d%d%d", &w[i].x, &w[i].y, &w[i].v); if(w[i].v < map[w[i].x][w[i].y]) map[w[i].x][w[i].y] = map[w[i].y][w[i].x] = w[i].v; } maxE = cal(); //printf("%d\n", maxE); printf("%d\n", dijkstra()); } return 0; }
相关文章推荐
- csu 1321 CX and girls 最短路 解题报告
- hdu 2544 最短路 spfa 解题报告
- CSU-ACM2014暑假集训基础组训练赛(1) 解题报告
- BZOJ 2118 数论+最短路(SPFA) 解题报告
- 2017湖南省多校第一场解题报告(CSU OJ)
- 洛谷 2737 麦香牛块 最短路SPFA? 解题报告
- hdu 2066 一个人的旅行 最短路 dijkstra 解题报告
- BZOJ 1003 DP+最短路 解题报告
- pku2243马棋到达最短路解题报告
- HDU 3339 In Action 解题报告(最短路+背包)
- 最短路spfaPOJInvitation Cardsj解题报告
- 解题报告 之 HDU2544 最短路
- HDU 3339 In Action 解题报告(最短路+背包)
- POJ1062 昂贵的聘礼 解题报告【最短路/SPFA】
- USACO 2006 nov POJ3255 严格次短路 解题报告
- poj 2449 Remmarguts' Date 第k短路 A*+spfa 解题报告
- csu 1282 Sphenic Number 暴力 解题报告
- POJ1724 ROADS 解题报告【最短路/SPFA】
- LuoguP1144 最短路计数 解题报告【SPFA/BFS】
- BZOJ 4720 [Noip 2016] 期望DP+最短路 解题报告