您的位置:首页 > 其它

poj 3159 Candies (差分约束)

2015-09-06 09:45 603 查看
一个叫差分约束系统的东西。如果每个点定义一个顶标x(v),x(t)-x(s)将对应着s-t的最短路径。



比如说w+a≤b,那么可以画一条a到b的有向边,权值为w,同样地给出b+w2≤c,a+w3≤c。那么a到c的最大差就受这些不等式约束,对应着图中的最短路。

这个边多,不要用vector存,满了以后重新复制数据,会T的,没试过指定大小。。。

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
//POJ 是个坑
const int maxn = 3e4+1;
const int maxm = 15e4+5;
struct Edge
{
int v,w,nxt;
//Edge(int v = 0,int w = 0):v(v), w(w){}
}edges[maxm];

int ecnt,head[maxn];

typedef pair<int,int> Node;
#define fi first
#define se second

void addEdge(int u,int v,int w)
{
edges[++ecnt].v = v;
edges[ecnt].w = w;
edges[ecnt].nxt = head[u];
head[u] = ecnt;
}

int d[maxn];

const int INF = 0x7f7f7f7f;

int dijkstra(int s, int t)
{
priority_queue<Node,vector<Node>,greater<Node> > q;
memset(d,0x7f,sizeof(d));
q.push(Node(d[s] = 0,s));
while(q.size()){
Node x = q.top(); q.pop();
int u = x.se;
if(u == t) return d[t];
if(x.fi != d[u]) continue;
for(int i = head[u]; i; i = edges[i].nxt){
Edge &e = edges[i];
if(d[e.v] - d[u] > e.w){
d[e.v] = d[u] + e.w;
q.push(Node(d[e.v],e.v));
}
}
}
return INF;
}

int main()
{
//freopen("in.txt","r",stdin);
int n,m; cin>>n>>m;
while(m--){
int u,v,w; scanf("%d%d%d",&u,&v,&w);
addEdge(u-1,v-1,w);
}
printf("%d\n",dijkstra(0,n-1));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: