您的位置:首页 > 其它

poj3159 最短路(差分约束)

2015-09-06 13:22 399 查看
题意:现在需要分糖果,有n个人,现在有些人觉得某个人的糖果数不能比自己多多少个,然后问n最多能在让所有人都满意的情况下比1多多少个。

这道题其实就是差分约束题目,根据题中给出的 a 认为 b 不能比 a 多 c 个,也就是 d[b] - d[a] ≤ c,就可以建立 value 值为 c 的单向边 e(a,b) ,然后先定d[1] = 0 ,用最短路跑完得到的 d
就是所求答案。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
typedef pair<int,int> pii;

int head[30005],point[150005],val[150005],next[150005],size;
int dist[30005];

struct cmp{
bool operator()(pii a,pii b){
return a.first>b.first;
}
};

void add(int a,int b,int v){
point[size]=b;
val[size]=v;
next[size]=head[a];
head[a]=size++;
}

void dij(int s,int t){
int i;
priority_queue<pii,vector<pii>,cmp>q;
memset(dist,0x3f,sizeof(dist));
dist[s]=0;
q.push(make_pair(dist[s],s));
while(!q.empty()){
pii u=q.top();
q.pop();
if(u.first>dist[u.second])continue;
for(i=head[u.second];~i;i=next[i]){
int j=point[i];
if(dist[j]>dist[u.second]+val[i]){
dist[j]=dist[u.second]+val[i];
q.push(make_pair(dist[j],j));
}
}
}
printf("%d\n",dist[t]);
}

int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
int i;
memset(head,-1,sizeof(head));
size=0;
for(i=1;i<=m;i++){
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
add(a,b,v);
}
dij(1,n);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: