[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 }
时间: 2024-12-17 03:05:44

[CSUOJ1808] 地铁(dijkstra,堆,边最短路)的相关文章

Bzoj 1975: [Sdoi2010]魔法猪学院 dijkstra,堆,A*,K短路

1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1357  Solved: 446[Submit][Status][Discuss] Description iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与元素之间可以互相转换:能量守恒……. 能量守恒……iPig 今

Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] Description Input Output Sample Input 2 1 1 2 1 1 2 2 Sample Output 5 HINT N<=20000,M<=100000 Source dijkstra+堆优化+分层图 把所有的横向和纵向分开看.跑最短路即可. 注意:N这么大,不能写

Bzoj 2763: [JLOI2011]飞行路线 dijkstra,堆,最短路,分层图

2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1728  Solved: 649[Submit][Status][Discuss] Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格.Alice和Bob现在要从一个城市沿着航线到达另一个城市

POJ 3013 Big Christmas Tree【最短路变形,DIjkstra堆优化+spfa算法】

Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23064   Accepted: 4987 Description Christmas is coming to KCM city. Suby the loyal civilian in KCM city is preparing a big neat Christmas tree. The simple structure of t

hdu 2544 单源最短路问题 dijkstra+堆优化模板

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41168    Accepted Submission(s): 17992 Problem Description 在每年的校赛里.全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的.所以如今他们想要寻

Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 dijkstra,堆,分层图

1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1573  Solved: 428[Submit][Status][Discuss] Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 <= P1_i <= N;

Heap+Dijkstra堆优化的Dijkstra

前面说到"原生的Dijkstra",由于Dijkstra采用的是贪心策略,在贪心寻找当前距离源结点最短的结点时需要遍历所有的结点,这必然会导致效率的下降,时间复杂度为n^n.因此当数据量较大时会消耗较长时间.为了提高Dijkstra的效率,只有对Dijkstra的贪心策略进行改进. 由于Dijkstra采用的贪心策略是每次寻找最短距离的结点并将其放入存放所有已知最短距离结点的S集合中,可以联想到堆以及优先级队列这些数据结构,这些结构都能非常高效地提供当前状态距离最短的结点.实践也可以证

Poj 1151 Invitation Cards dijkstra 堆优化

很裸的最短路,不过节点数和边数都是1e6,直接dij肯定是不行了,稀疏图用heap优化一下就好 o(╯□╰)o注意STL里面的优先队列是优先级大的(值大的)在前面的,一开始没注意WA了好几发,哎,太粗心了 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #inc

POJ 3268 Silver Cow Party dijkstra单源最短路

裸dijkstra 思路:以x为源点,求到其他点的最短路,之后把邻接矩阵转置,再求一次x源 点的最短路,这样就一次是来的,一次是走的,相加迭代最大值即可 代码: /* poj 3268 8108K 47MS */ #include<cstdio> #include<iostream> #define MAXN 1005 #define MAX_INT 2147483647 using namespace std; int gra_in[MAXN][MAXN],gra_out[MAX

【日常学习】【Dijkstra堆优化】codevs2038 香甜的黄油题解

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake 先放上题目,出自USACO 题目描述 Description 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油.当然,他将付出额外的费用在奶牛上. 农夫John很狡猾.他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场.他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶. 农