[CSUOJ1808] 地铁(dijkstra,堆,边最短路)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CSUOJ1808] 地铁(dijkstra,堆,边最短路)相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808

题意:题面挺清楚啦,就是求一个最短路。只不过每个点之间的边有可能是不同线路的,要从一个线路换到另一个线路是需要花费时间的。

边有特殊的定义,那么就不以点为分析对象做最短路了。直接拿边,dis(i)表示从1到达第i条边的指向点为终点的最短距离,每次松弛找到的边的目的点是t的时候更新一下结果。

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <iomanip>
  4 #include <cstring>
  5 #include <climits>
  6 #include <complex>
  7 #include <fstream>
  8 #include <cassert>
  9 #include <cstdio>
 10 #include <bitset>
 11 #include <vector>
 12 #include <deque>
 13 #include <queue>
 14 #include <stack>
 15 #include <ctime>
 16 #include <set>
 17 #include <map>
 18 #include <cmath>
 19  
 20 using namespace std;
 21 #define fr first
 22 #define sc second
 23 #define cl clear
 24 #define BUG puts("here!!!")
 25 #define W(a) while(a--)
 26 #define pb(a) push_back(a)
 27 #define Rint(a) scanf("%d", &a)
 28 #define Rll(a) scanf("%I64d", &a)
 29 #define Rs(a) scanf("%s", a)
 30 #define Cin(a) cin >> a
 31 #define FRead() freopen("in", "r", stdin)
 32 #define FWrite() freopen("out", "w", stdout)
 33 #define Rep(i, len) for(int i = 0; i < (len); i++)
 34 #define For(i, a, len) for(int i = (a); i < (len); i++)
 35 #define Cls(a) memset((a), 0, sizeof(a))
 36 #define Clr(a, p) memset((a), (p), sizeof(a))
 37 #define Full(a) memset((a), 0x7f7f7f, sizeof(a))
 38 #define lrt rt << 1
 39 #define rrt rt << 1 | 1
 40 #define pi 3.14159265359
 41 #define RT return
 42 #define lowbit(p) p & (-p)
 43 #define onenum(p) __builtin_popcount(p)
 44 typedef long long LL;
 45 typedef long double LD;
 46 typedef unsigned long long ULL;
 47 typedef pair<int, int> pii;
 48 typedef pair<string, int> psi;
 49 typedef pair<LL, LL> pll;
 50 typedef map<string, int> msi;
 51 typedef vector<int> vi;
 52 typedef vector<LL> vl;
 53 typedef vector<vl> vvl;
 54 typedef vector<bool> vb;
 55  
 56 const int inf = 1e18;
 57 const int maxn = 100100;
 58 typedef struct Edge {
 59     int u, v, w, c, next;
 60     Edge() { next = -1; }
 61     Edge(int uu, int vv, int ww, int cc) : u(uu), v(vv), w(ww), c(cc) { next = -1; }
 62 }Edge;
 63 typedef struct P {
 64     int id, w;
 65     P() {}
 66     P(int i, int ww) : id(i), w(ww) {}
 67     bool operator< (const P& a) const {
 68         return w > a.w;
 69     }
 70 }P;
 71 int head[maxn];
 72 Edge edge[maxn*2];
 73 bool vis[maxn*2];
 74 LL dis[maxn*2];
 75 int n, m, u, v, w, c;
 76 int cnt;
 77  
 78 void init() {
 79     Clr(head, -1); Clr(edge, -1);
 80     cnt = 0;
 81 }
 82  
 83 void adde(int u, int v, int c, int w) {
 84   edge[cnt].u = u; edge[cnt].v = v; edge[cnt].c = c; edge[cnt].w = w;  
 85   edge[cnt].next = head[u]; head[u] = cnt++;
 86 }
 87  
 88 LL dij(int s, int t) {
 89     LL ret = inf;
 90     Cls(vis);
 91     Rep(i, cnt) dis[i] = inf;
 92     priority_queue<P> pq;
 93     for(int i = head[s]; ~i; i=edge[i].next) {
 94         dis[i] = edge[i].w;
 95         pq.push(P(i, dis[i]));
 96     }
 97     while(!pq.empty()) {
 98         P tmp = pq.top(); pq.pop();
 99         int id = tmp.id;
100         if(vis[id]) continue;
101         vis[id] = 1;
102         u = edge[id].v;
103         if(u == t) ret = min(ret, dis[id]);
104         for(int i = head[u]; ~i; i=edge[i].next) {
105             v = edge[i].v;
106             if(!vis[i] && dis[i] > dis[id] + edge[i].w + abs(edge[i].c - edge[id].c)) {
107                 dis[i] = dis[id] + edge[i].w + abs(edge[i].c - edge[id].c);
108                 pq.push(P(i, dis[i]));
109             }
110         }
111     }
112     return ret;
113 }
114  
115 int main() {
116     // FRead();
117     while(~Rint(n)&&~Rint(m)) {
118         init();
119         Rep(i, m) {
120             scanf("%d%d%d%d",&u,&v,&c,&w);
121             adde(u, v, c, w);
122             adde(v, u, c, w);
123         }
124         cout << dij(1, n) << endl;
125     }
126     RT 0;
127 }

 

以上是关于[CSUOJ1808] 地铁(dijkstra,堆,边最短路)的主要内容,如果未能解决你的问题,请参考以下文章

CSU 1808 - 地铁 - [最短路变形]

CSU 1808 地铁

1808: 地铁

CSU 1808 地铁

CSU1808地铁

ccf20170304地铁修建_Solution