SPFA/Dijkstra POJ 3159 Candies
题意:n个人发糖果,B 比 A 多 C的糖果,问最后第n个人比第一个人多多少的糖果
分析:最短路,Dijkstra 优先队列优化可过,SPFA竟然要用栈,队列超时!
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | /************************************************ * Author :Running_Time * Created Time :2015-9-1 19:18:52 * File Name :POJ_3159.cpp ************************************************/ #include <cstdio> #include <algorithm> #include <iostream> #include <sstream> #include <cstring> #include <cmath> #include <string> #include <vector> #include <queue> #include <deque> #include <stack> #include <list> #include <map> #include <set> #include <bitset> #include <cstdlib> #include <ctime> using namespace std; #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 typedef long long ll; const int N = 3e4 + 10; const int E = 150000 + 10; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; struct Edge { int v, w, nex; Edge ( int _v = 0, int _w = 0) : v (_v), w (_w) {} bool operator < ( const Edge &r) const { return w > r.w; } }edge[E]; int d[N]; int head[N]; int vis[N]; int cnt[N]; int n, m, e; void init( void ) { memset (head, -1, sizeof (head)); e = 0; } void Dijkstra( int s) { memset (vis, false , sizeof (vis)); for ( int i=1; i<=n; ++i) d[i] = INF; d[s] = 0; priority_queue<Edge> Q; Q.push (Edge (s, 0)); while (!Q.empty ()) { int u = Q.top ().v; Q.pop (); if (vis[u]) continue ; vis[u] = true ; for ( int i=head[u]; ~i; i=edge[i].nex) { int v = edge[i].v, w = edge[i].w; if (!vis[v] && d[v] > d[u] + w) { d[v] = d[u] + w; Q.push (Edge (v, d[v])); } } } } void SPFA( int s) { memset (vis, false , sizeof (vis)); memset (d, INF, sizeof (d)); d[s] = 0; vis[s] = true ; stack< int > S; S.push (s); while (!S.empty ()) { int u = S.top (); S.pop (); vis[u] = false ; for ( int i=head[u]; ~i; i=edge[i].nex) { int v = edge[i].v, w = edge[i].w; if (d[v] > d[u] + w) { d[v] = d[u] + w; if (!vis[v]) { vis[v] = true ; S.push (v); } } } } } void add_edge( int u, int v, int w) { edge[e].v = v, edge[e].w = w; edge[e].nex = head[u]; head[u] = e++; } int main( void ) { while ( scanf ( "%d%d" , &n, &m) == 2) { init (); for ( int u, v, w, i=1; i<=m; ++i) { scanf ( "%d%d%d" , &u, &v, &w); add_edge (u, v, w); } //Dijkstra (1); SPFA (1); printf ( "%d\n" , d[n]); } return 0; } |
编译人生,运行世界!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步