题意:每行输入A、B、X 表示p[B] - p[A] >= X;求max( p[N] - p[1] )
思路:建图spfa+stack,一开始用的vecter做邻接表超时,用spfa+queue超时。改过后过了……
代码:
/*
poj 3159 查分约束
i j x 表示p[j] - p[i] >= x;
求max(p[n] - p[1])
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <deque>
#include <string>
using namespace std;
#define For(i,a) for(i=0;i<a;i++)
#define Foru(i,a,b) for(i=a;i<=b;i++)
#define Ford(i,a,b) for(i=a;i>=b;i--)
#define clr(ar,vel) memset(ar,vel,sizeof(ar))
#define PB push_back
typedef long long ll;
const int maxint = 0x7fffffff;
const ll maxll = 1LL<<60;
const int maxn = 30010;
const int maxv = 150010;
int size, head[maxn];
struct Edge{int to, dis, next;};
Edge edge[maxv];
int add_edge(int from, int to, int dis){
edge[size].to = to;
edge[size].dis = dis;
edge[size].next = head[from];
head[from] = size++;
}
bool vis[maxn];
int dis[maxn];
int n, m;
int spfa(int s, int t){
int res;
stack<int> dq;
memset(vis, 0, sizeof(vis));
fill(dis, dis+n+1, maxint);
dis[s] = 0;
dq.push(s);
while(dq.size()){
int fn = dq.front(); dq.pop();
vis[fn] = 0;
for(int i = head[fn]; i != -1; i = edge[i].next){
int to = edge[i].to;
int vel = edge[i].dis;
if( dis[to] > dis[fn] + vel) {
dis[to] = dis[fn] + vel;
if( !vis[to] ) {
vis[to] = 1;
dq.push(to);
}
}
}
}
return dis[t];
}
int main(){
// ios::sync_with_stdio(false);
int from, to, vel;
while(~scanf("%d%d",&n,&m)){
memset(head, -1, sizeof(head));
size = 0;
while(m--){
scanf("%d%d%d",&from,&to,&vel);
add_edge(from, to, vel);
}
spfa(1, n);
printf("%d\n",dis[n]);
}
return 0;
}