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
就是所求答案。
View Code
这道题其实就是差分约束题目,根据题中给出的 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
相关文章推荐
- shell
- 开发中遇到的问题记录
- JAVA PHP 调用cmd命令
- 回调模式
- 线段树
- UI入门教程
- iOS开发:UITableView编辑——cell的删除和移动
- PCB各层介绍和AltiumDesigner画PCB时的规则设置
- C++中引用(&)的用法和应用实例
- Linux下架构roundcube Email service
- 数据结构与算法Java---1.6
- WPF01(xaml)
- FlowVisor相关
- 哈夫曼编码
- 【搬迁通告】很遗憾的告诉您,我们将在半年内进行新一轮的场地升级!离开这个革命根据地......
- C++11系列学习之二-----lambda表达式
- iOS 响应者链条
- C#dataset中数据导出到excel
- 年度总结-让青春更有意义
- VS_VERSION_INFO