题意:现在需要分糖果,有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 }
时间: 2024-10-10 08:15:37