
题意:现在需要分糖果,有n个人,现在有些人觉得某个人的糖果数不能比自己多多少个,然后问n最多能在让所有人都满意的情况下比1多多少个。
这道题其实就是差分约束题目,根据题中给出的 a 认为 b 不能比 a 多 c 个,也就是 d[b] - d[a] ≤ c,就可以建立 value 值为 c 的单向边 e(a,b) ,然后先定d[1] = 0 ,用最短路跑完得到的 d[n] 就是所求答案。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
typedef pair<int,int> pii; int head[],point[],val[],next[],size;
int dist[]; 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]=;
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,-,sizeof(head));
size=;
for(i=;i<=m;i++){
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
add(a,b,v);
}
dij(,n);
}
return ;
}