现在的位置: 首页 > 综合 > 正文

poj3159(差分约束)

2018年02月23日 ⁄ 综合 ⁄ 共 1428字 ⁄ 字号 评论关闭

题目:poj 3159 Candies

题意:每行输入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;
}

抱歉!评论已关闭.