标签:
题意:现在需要分糖果,有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\n",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 }
标签:
原文地址:http://www.cnblogs.com/cenariusxz/p/4785276.html