poj3159 最短路(差分约束)

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

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

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<vector>
 6 using namespace std;
 7 typedef pair<int,int> pii;
 8 
 9 int head[30005],point[150005],val[150005],next[150005],size;
10 int dist[30005];
11 
12 struct cmp{
13     bool operator()(pii a,pii b){
14         return a.first>b.first;
15     }
16 };
17 
18 void add(int a,int b,int v){
19     point[size]=b;
20     val[size]=v;
21     next[size]=head[a];
22     head[a]=size++;
23 }
24 
25 void dij(int s,int t){
26     int i;
27     priority_queue<pii,vector<pii>,cmp>q;
28     memset(dist,0x3f,sizeof(dist));
29     dist[s]=0;
30     q.push(make_pair(dist[s],s));
31     while(!q.empty()){
32         pii u=q.top();
33         q.pop();
34         if(u.first>dist[u.second])continue;
35         for(i=head[u.second];~i;i=next[i]){
36             int j=point[i];
37             if(dist[j]>dist[u.second]+val[i]){
38                 dist[j]=dist[u.second]+val[i];
39                 q.push(make_pair(dist[j],j));
40             }
41         }
42     }
43     printf("%d
",dist[t]);
44 }
45 
46 int main(){
47     int n,m;
48     while(scanf("%d%d",&n,&m)!=EOF){
49         int i;
50         memset(head,-1,sizeof(head));
51         size=0;
52         for(i=1;i<=m;i++){
53             int a,b,v;
54             scanf("%d%d%d",&a,&b,&v);
55             add(a,b,v);
56         }
57         dij(1,n);
58     }
59     return 0;
60 }
View Code
原文地址:https://www.cnblogs.com/cenariusxz/p/4785276.html