[USACO18DEC]Fine Dining
https://www.luogu.org/problemnew/show/P5122
题意:n个点,含有k个干草堆,问前n-1个点到第n个点的【经过任一干草堆的最短路】减去【不加限制的最短路】是否不超过那个干草堆的美味值。
思路:
①搞Dijkstra的变形,设d[i][0]为i到n的最短路,d[i][1]为i到n的经过干草堆的最短路减去那个干草堆的美味值的大小。松弛操作跟着变形。最后判断每个点是否d[i][1]<=d[i][0]
②加一个虚拟结点n+1,向k个干草堆连边,权值为每个干草堆到n的最短路减去美味值。跑两次Dijkstra即可。最后判断每个点是否d[i]<=d2[i]
无向图,直接从终点n往回跑就行了。
Q:为什么要把美味值加到边权里,不能最后判断每个点是否满足【经过干草堆的最短路】-美味值<=【不加限制的最短路】呢?
A:对于任一点i,如果最后判断,不知道【经过干草堆的最短路】经过的是哪个,也就不知道减的是哪个干草堆的美味值,而且,在Dijkstra处理中,对于这k个干草堆是不能一视同仁的,要综合考虑i经过每个干草堆到n的距离大小以及每个干草堆的美味值。故应该把美味值作为经过那个干草堆的路径的固有属性。
①:
#include<bits/stdc++.h>
using namespace std;
#define maxn 50000+1000
#define INF 0x3f3f3f3fstruct Edge{int from,to,dist;
};
struct HeapNode{int u,flag,d;bool operator < (const HeapNode& x)const{return d>x.d;}
};
int n,m,k,y[maxn];
vector<Edge> edges;
vector<int> G[maxn];
bool vis[maxn][2];
int d[maxn][2];void init()
{edges.clear();for(int i=1;i<=n;i++)G[i].clear();
}void AddEdge(int f,int t,int d)
{edges.push_back((Edge){f,t,d});G[f].push_back(edges.size()-1);
}void dijkstra(int s)
{priority_queue<HeapNode> Q;for(int i=1;i<=n;i++)d[i][0]=d[i][1]=INF;d[s][0]=0;memset(vis,0,sizeof(vis));Q.push((HeapNode){s,0,0});while(!Q.empty()){HeapNode x=Q.top();Q.pop();int u=x.u,flag=x.flag;if(vis[u][flag])continue;vis[u][flag]=1;for(int i=0;i<G[u].size();i++){Edge& e=edges[G[u][i]];int v=e.to;if(!flag){if(d[v][0]>d[u][0]+e.dist){d[v][0]=d[u][0]+e.dist;Q.push((HeapNode){v,0,d[v][0]});}if(y[v]&&d[v][1]>d[u][0]+e.dist-y[v]){d[v][1]=d[u][0]+e.dist-y[v];Q.push((HeapNode){v,1,d[v][1]});}}else{if(d[v][1]>d[u][1]+e.dist){d[v][1]=d[u][1]+e.dist;Q.push((HeapNode){v,1,d[v][1]});}}}}
}int main()
{
// freopen("input.in","r",stdin);scanf("%d%d%d",&n,&m,&k);int a,b,c;while(m--){scanf("%d%d%d",&a,&b,&c);AddEdge(a,b,c);AddEdge(b,a,c);}for(int i=1;i<=k;i++){scanf("%d%d",&a,&b);y[a]=b;}dijkstra(n);for(int i=1;i<n;i++)if(d[i][1]<=d[i][0])puts("1"); else puts("0");return 0;
}
②:
#include<bits/stdc++.h>
using namespace std;
#define maxn 50000+1000
#define INF 0x3f3f3f3fstruct Edge{int from,to,dist;
};
struct HeapNode{int u,d;bool operator < (const HeapNode& x)const{return d>x.d;}
};
int n,m,k,y[maxn];
vector<Edge> edges;
vector<int> G[maxn];
bool vis[maxn];
int d[maxn],d2[maxn];void init()
{edges.clear();for(int i=1;i<=n;i++)G[i].clear();
}void AddEdge(int f,int t,int d)
{edges.push_back((Edge){f,t,d});G[f].push_back(edges.size()-1);
}void dijkstra(int s,int *d)
{priority_queue<HeapNode> Q;for(int i=1;i<=n;i++)d[i]=d[i]=INF;d[s]=0;memset(vis,0,sizeof(vis));Q.push((HeapNode){s,0});while(!Q.empty()){HeapNode x=Q.top();Q.pop();int u=x.u;if(vis[u])continue;vis[u]=1;for(int i=0;i<G[u].size();i++){Edge& e=edges[G[u][i]];int v=e.to; if(d[v]>d[u]+e.dist){d[v]=d[u]+e.dist;Q.push((HeapNode){v,d[v]});} }}
}int main()
{
// freopen("input.in","r",stdin);scanf("%d%d%d",&n,&m,&k);int a,b,c;while(m--){scanf("%d%d%d",&a,&b,&c);AddEdge(a,b,c);AddEdge(b,a,c);}for(int i=1;i<=k;i++){scanf("%d%d",&a,&b);y[a]=b;}dijkstra(n,d);for(int i=1;i<=n;i++)if(y[i]){AddEdge(n+1,i,d[i]-y[i]);}dijkstra(n+1,d2);for(int i=1;i<n;i++)if(d2[i]<=d[i])puts("1"); else puts("0");return 0;
}
[USACO18DEC]Fine Dining相关推荐
- Fine Dining G
题目链接:Fine Dining G 把经过食物看成一条负权边,那么就是经过一次食物的最短路是否小于等于不经过的最短路. 建立分层图即可. AC代码: #pragma GCC optimize(&qu ...
- Fine Dining(最短路应用)
原题: http://acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=2255 题意: n点m无向边,终点为点n.有k个东西,给出每个东西的位置,以及 ...
- 中国杀软套路深:CIA怼遍全世界竟然干不过它
提到CIA,就是一个爱搞事的部门,他们全球范围内的网络间谍活动消息源源不断,甚至连智能电视和汽车都要窃听.不过根据维基解密爆料,CIA虽然拥有庞大的黑客武器库,却在中国碰了一鼻子灰. 维基解密披露的C ...
- 餐厅菜单html代码,html5css3 3D餐厅菜单概念_订餐菜单选择工具
特效描述:html5css3 3D餐厅菜单概念 订餐菜单选择工具.html5&css3 3D餐厅菜单概念 代码结构 1. 引入CSS 2. 引入JS 3. HTML代码 Gourmet Cas ...
- The 10 Best Neighborhoods in Seattle
https://www.seattlemet.com/articles/2015/4/24/the-10-best-neighborhoods-in-seattle-may-2015 By Darre ...
- oracle simphony_MICROS Simphony | All-In-One Restaurant POS System | Oracle 中国
未找到结果 您的搜索操作未匹配到任何结果. 我们建议您尝试以下操作,以帮助您找到所需内容: 检查关键词搜索的拼写. 使用同义词代替键入的关键词,例如,尝试使用"应用"代替" ...
- 中国北京TRB Hutong首登全球高级餐厅榜单首位
全球旅游规划和预订平台猫途鹰(TripAdvisor)公布了2019年"旅行者之选"全球餐厅榜单.入选餐厅基于一整年内来自猫途鹰(TripAdvisor)的点评,且获得了全球食客给 ...
- USACO比赛题泛刷
随时可能弃坑. 因为不知道最近要刷啥所以就决定刷下usaco. 优先级排在学习新算法和打比赛之后. 仅有一句话题解.难一点的可能有代码. 优先级是Gold>Silver.Platinum刷不动. ...
- vocabularies181126
concurrent并发 isolation隔离 nomad游牧民digital nomad Czech捷克 Prague布拉格 Granada alley小巷 pub酒吧pub street at ...
最新文章
- 上传图片被防火墙拦截_Web安全:文件上传漏洞
- 24点游戏c语言链表做法,C语言实现24点程序(示例代码)
- VS2015使用scanf报错解决方案
- C++ Primer 第三章 字符串、向量和数组
- AtCoder AGC036D Negative Cycle (图论、DP)
- BugKuCTF 杂项 又一张图片,还单纯吗
- linux下php安装redis,Linux下php安装redis和phpredis库
- InfluxDB基本使用说明
- 算法题 如何找到数组中重复的数字
- c# 计算空格宽度像素_用pythonnet为计算机视觉做图像整理
- C#编码规范2[转]
- 红帽学习笔记[RHCSA] 第三课[输出重定向、Vi编辑器]
- 广东电网公司大数据平台初步建成
- Java编程思想(五) —— 多态(下)
- 进度管理案例分析——常见问题及答案
- MATLAB之M文件
- SAP 如何保证同一销售业务产生的收入和成本计入相同的会计期间?
- 以太坊geth节点同步亲测经历
- 有趣的23000----整理(07)A词根
- 与领导吃饭需要注意什么
热门文章
- 慈溪视频软件测试,慈溪论坛
- 还在为不知道怎么学习网络安全而烦恼吗?这篇文带你从入门级开始学习网络安全—认识网络安全
- react-native-beacons-manager扫描beacons为空数组(android)--工作笔记
- Anroid中Service详解
- 东南大学计算机学院分数线,“东南大学”2019本一批次专业录取分数整理!计算机、建筑领域实力强,又是985、211、双一流名校!...
- Php运行lpush失败,php苹果推送APNS push常用出错和解决方法
- 计算机在医疗设备中的应用,计算机在医疗设备管理中的应用
- mysql人像伴随模型_还不了解MySQL跨行事务模型吗?看完这篇你也就差不多了!...
- (附源码)ssm 座位管理系统 毕业设计 250858
- CPU卡内部认证与外部认证