POJ 2502 Subway 【最短路之建图为关键】
2018-02-13 16:16
351 查看
传送门
题意: 有n条地铁线, 相邻两站可以做地铁到达, 速度为40km/h, 可以在任意站换乘其他地铁线必须走路, 速度为10km/h, 给定起点和终点问最少需要多少分钟才能到终点.
思路: 很明显这是一个最短路, 关键在于建图, 因为每个点都要向终点连一条速度为10km/h的边, 同时起点也想每个站连边, 同一条地铁线的相邻站连40km/h的边, 不同的地铁线中的站也要两两连走路的边, 然后跑最短路即可. 具体建图过程请看代码实现.
AC Code
题意: 有n条地铁线, 相邻两站可以做地铁到达, 速度为40km/h, 可以在任意站换乘其他地铁线必须走路, 速度为10km/h, 给定起点和终点问最少需要多少分钟才能到终点.
思路: 很明显这是一个最短路, 关键在于建图, 因为每个点都要向终点连一条速度为10km/h的边, 同时起点也想每个站连边, 同一条地铁线的相邻站连40km/h的边, 不同的地铁线中的站也要两两连走路的边, 然后跑最短路即可. 具体建图过程请看代码实现.
AC Code
const int maxn = 3e2+5; const int maxm = 2e5 + 5; struct node { int to, next; db w; bool operator < (const node& a) const { return w > a.w; } } e[maxm]; int cnt, head[maxn]; void add(int u, int v, db w) { e[cnt] = node{v, head[u], w}; head[u] = cnt++; } void init() { cnt = 0; Fill(head, -1); } bool vis[maxn]; db dis[maxn]; int id; void dij(int st,int ed) { priority_queue<node> q; for (int i = 1 ; i <= id ; i ++) dis[i] = inf; Fill(vis,0); dis[st] = 0; q.push(node{st, 0, 0}); while (!q.empty()) { node u = q.top(); q.pop(); if (u.to == ed) break; if(vis[u.to]) continue; vis[u.to] = 1; for (int i = head[u.to]; ~i; i = e[i].next) { int to = e[i].to; if (dis[to] > dis[u.to] + e[i].w) { dis[to] = dis[u.to] + e[i].w; q.push(node{to, 0, dis[to]}); } } } printf("%.0f\n", dis[ed]); } const db walkv = 500.0 / 3; const db subv = 2000.0 / 3; struct point { db x, y; }pp[maxn]; db cal(point a, point b) { return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y)); } void solve() { init(); scanf("%lf%lf%lf%lf", &pp[1].x, &pp[1].y, &pp[2].x, &pp[2].y); int flag = 1; id = 2; db tx, ty; while(cin >> tx >> ty) { if (tx == -1 && ty == -1) { flag = 1; continue; } pp[++id].x = tx; pp[id].y = ty; if (flag > 1) { // 相邻地铁线 add(id-1, id, cal(pp[id-1], pp[id])/subv); add(id, id-1, cal(pp[id-1], pp[id])/subv); } flag++; } for (int i = 1 ; i <= id ; i ++) { // 所以点之间两两连线. for (int j = i + 1 ; j <= id ; j++) { add(i, j, cal(pp[i], pp[j])/walkv); add(j, i, cal(pp[j], pp[i])/walkv); } } dij(1, 2); }
相关文章推荐
- POJ 2502 Subway(Floyd单源最短路)
- POJ2502 Subway(最短路Floyed)
- 最短路练习12/poj/2502 Subway dijkstar,spfa,floyd都可以解决
- POJ-2502 Subway(最短路)
- POJ 2502 Subway 关键在建图
- poj 2502最短路subway
- POJ - 2502 SUBWAY(FLOYD算法求解最短路)
- poj 2502 subway (最短路)
- POJ 2502 Subway (最短路)
- POJ2502 subway(dijkstra以最短时间代替最短路)
- poj 2502 Subway (最短路 Dijksta)
- POJ-2502 Subway( 最短路 )
- POJ 2502 - Subway(单源最短路)
- POJ 2502 Subway 最短路 Floyd
- 【POJ 2502】Subway(最短路dij)
- poj 2502 Subway 最短路
- POJ2502---Subway (最短路:spfa or floyed)
- POJ 2502 Subway 单源点最短路模板
- [POJ 2502]Subway[最短路]
- poj 2502 Subway(dijkstra 最短路)