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相关推荐

  1. Fine Dining G

    题目链接:Fine Dining G 把经过食物看成一条负权边,那么就是经过一次食物的最短路是否小于等于不经过的最短路. 建立分层图即可. AC代码: #pragma GCC optimize(&qu ...

  2. Fine Dining(最短路应用)

    原题: http://acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=2255 题意: n点m无向边,终点为点n.有k个东西,给出每个东西的位置,以及 ...

  3. 中国杀软套路深:CIA怼遍全世界竟然干不过它

    提到CIA,就是一个爱搞事的部门,他们全球范围内的网络间谍活动消息源源不断,甚至连智能电视和汽车都要窃听.不过根据维基解密爆料,CIA虽然拥有庞大的黑客武器库,却在中国碰了一鼻子灰. 维基解密披露的C ...

  4. 餐厅菜单html代码,html5css3 3D餐厅菜单概念_订餐菜单选择工具

    特效描述:html5css3 3D餐厅菜单概念 订餐菜单选择工具.html5&css3 3D餐厅菜单概念 代码结构 1. 引入CSS 2. 引入JS 3. HTML代码 Gourmet Cas ...

  5. The 10 Best Neighborhoods in Seattle

    https://www.seattlemet.com/articles/2015/4/24/the-10-best-neighborhoods-in-seattle-may-2015 By Darre ...

  6. oracle simphony_MICROS Simphony | All-In-One Restaurant POS System | Oracle 中国

    未找到结果 您的搜索操作未匹配到任何结果. 我们建议您尝试以下操作,以帮助您找到所需内容: 检查关键词搜索的拼写. 使用同义词代替键入的关键词,例如,尝试使用"应用"代替" ...

  7. 中国北京TRB Hutong首登全球高级餐厅榜单首位

    全球旅游规划和预订平台猫途鹰(TripAdvisor)公布了2019年"旅行者之选"全球餐厅榜单.入选餐厅基于一整年内来自猫途鹰(TripAdvisor)的点评,且获得了全球食客给 ...

  8. USACO比赛题泛刷

    随时可能弃坑. 因为不知道最近要刷啥所以就决定刷下usaco. 优先级排在学习新算法和打比赛之后. 仅有一句话题解.难一点的可能有代码. 优先级是Gold>Silver.Platinum刷不动. ...

  9. vocabularies181126

    concurrent并发 isolation隔离 nomad游牧民digital nomad Czech捷克 Prague布拉格 Granada alley小巷 pub酒吧pub street at ...

最新文章

  1. 上传图片被防火墙拦截_Web安全:文件上传漏洞
  2. 24点游戏c语言链表做法,C语言实现24点程序(示例代码)
  3. VS2015使用scanf报错解决方案
  4. C++ Primer 第三章 字符串、向量和数组
  5. AtCoder AGC036D Negative Cycle (图论、DP)
  6. BugKuCTF 杂项 又一张图片,还单纯吗
  7. linux下php安装redis,Linux下php安装redis和phpredis库
  8. InfluxDB基本使用说明
  9. 算法题 如何找到数组中重复的数字
  10. c# 计算空格宽度像素_用pythonnet为计算机视觉做图像整理
  11. C#编码规范2[转]
  12. 红帽学习笔记[RHCSA] 第三课[输出重定向、Vi编辑器]
  13. 广东电网公司大数据平台初步建成
  14. Java编程思想(五) —— 多态(下)
  15. 进度管理案例分析——常见问题及答案
  16. MATLAB之M文件
  17. SAP 如何保证同一销售业务产生的收入和成本计入相同的会计期间?
  18. 以太坊geth节点同步亲测经历
  19. 有趣的23000----整理(07)A词根
  20. 与领导吃饭需要注意什么

热门文章

  1. 慈溪视频软件测试,慈溪论坛
  2. 还在为不知道怎么学习网络安全而烦恼吗?这篇文带你从入门级开始学习网络安全—认识网络安全
  3. react-native-beacons-manager扫描beacons为空数组(android)--工作笔记
  4. Anroid中Service详解
  5. 东南大学计算机学院分数线,“东南大学”2019本一批次专业录取分数整理!计算机、建筑领域实力强,又是985、211、双一流名校!...
  6. Php运行lpush失败,php苹果推送APNS push常用出错和解决方法
  7. 计算机在医疗设备中的应用,计算机在医疗设备管理中的应用
  8. mysql人像伴随模型_还不了解MySQL跨行事务模型吗?看完这篇你也就差不多了!...
  9. (附源码)ssm 座位管理系统 毕业设计 250858
  10. CPU卡内部认证与外部认证