题目链接。
分析:
这题很简单。就是差分约束。d[B]-d[A]<=C。不过在用spfa提交时一直TLE。不明白为什么,一查才知道这题要用栈(据说栈有时会比队列快?)。。虽说AC了。但总觉得。莫名其妙。思考一番,应该是对spfa的优化不是很了解。再者,听说用dijkstra+heap一般不会被卡住,所以我决定要开始学习堆、以及spfa的各种优化了。。加油。加油!!!
#include <cstdio> #include <stack> using namespace std; #define MAXN 30010 #define MAXM 150010 const int INF = (1<<24); struct node{ int v, w; int next; }edge[MAXM]; stack<int> s; int head[MAXN], d[MAXN], vis[MAXN], n, m, top; void Init(){ top = 0; for(int i=1; i<=n; i++){ head[i] = -1; d[i] = INF; vis[i] = 0; } } void add(int u, int v, int w){ edge[top].v = v; edge[top].w = w; edge[top].next = head[u]; head[u] = top++; } int spfa(){ int u, i, v, w; d[1] = 0; vis[1] = 0; s.push(1); while(!s.empty()){ u = s.top(); s.pop(); vis[u] = 0; for(i=head[u]; i != -1; i = edge[i].next){ v = edge[i].v; w = edge[i].w; if(d[v]>d[u]+w){ d[v] = d[u]+w; if(!vis[v]){ vis[v]=1; s.push(v); } } } } return d[n]-d[1]; } int main(){ int i, u, v, w; scanf("%d %d", &n, &m); Init(); for(i=0; i<m; i++){ scanf("%d %d %d", &u, &v, &w); add(u, v, w); } printf("%d\n", spfa()); return 0; }