POJ 3159 Candies(SPFA+棧)差分約束
阿新 • • 發佈:2019-02-03
題意:給出m給 x 與y的關係,其中y的糖數不能比x的多c個,即y-x <= c 最後求fly[n]最多能比so[1] 多多少糖?
差分約束問題, 就是求1-n的最短路, 佇列實現spfa 會超時了,改為棧實現,即可
有負環時,用棧比佇列快
陣列開小了,不報RE,報超時 ,我暈
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <queue> #include <stack> #include <algorithm> const int N = 210; const int maxn = 30100; const int maxm = 200000; #define FOR(i,a,b) for(int i=a;i<b;i++) #define init(a) memset(a,0,sizeof(a)) #define MIN INT_MIN #define MAX INT_MAX #define LL long long using namespace std; int max(int a,int b){if(a>b)return a; else return b;} int min(int a,int b){if(a<b)return a; else return b;} const int INF=0x3f3f3f3f; struct node { int v,w; int next; }edge[maxm]; int head[maxn]; bool vis[maxn]; int dis[maxn]; int cnt; void add(int a,int b,int w)//加邊 { edge[cnt].v=b; edge[cnt].w=w; edge[cnt].next=head[a]; head[a]=cnt++; } void SPFA(int s,int n) { //stack<int>stk; int stk[100000]; int top = 0; //stk.push(s); stk[top++] = s; FOR(i,1,n+1) {dis[i] = INF; vis[i] = 0; } dis[s] = 0; vis[s] = 1; while(top!=0) { int u=stk[--top]; //stk.pop(); vis[u]=false; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(dis[v]>dis[u]+edge[i].w) { dis[v]=dis[u]+edge[i].w; if(!vis[v]) { vis[v]=true; stk[top++] = v; } } } } } void initt() { cnt=0; memset(head,-1,sizeof(head)); } int main() { int n,m; int a,b,c; while(scanf("%d%d",&n,&m)!=EOF) { initt(); while(m--) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); } SPFA(1,n); printf("%d\n",dis[n]); } return 0; }