计蒜客:热爱工作的蒜蒜(最短路)
来源:互联网 发布:multigo 围棋棋谱软件 编辑:程序博客网 时间:2024/04/30 11:38
题目链接
热爱工作的蒜蒜
Problem Description
众所周知,蒜蒜是一名热爱工作的好员工,他觉得时间就是金钱,做事情总是争分夺秒。
这天晚上,蒜蒜一个人去吃晚饭。不巧的是,吃完饭以后就开始下雨了,蒜蒜并没有带雨伞出来。但是蒜蒜热爱工作,工作使他快乐,他要尽快赶回去写代码。
蒜蒜的公司在中关村,中关村这边地形复杂,有很多天桥、地下通道和马路交错在一起。其中,地下通道是可以避雨的,天桥和马路都没办法避。可以把中关村抽象成为 n 个点的地图(顶点编号为 1到 n),其中有
请你赶紧帮热爱工作的蒜蒜规划一条路径吧,不要再让他浪费时间。
Input
所有路径都是双向的。
Output
对于每组数据,如果有满足要求的路径,输出一个整数,表示淋雨的路程长度,否则输出
Sample Input
34 2 2 61 22 31 4 53 4 44 2 2 51 22 31 4 53 4 44 2 2 41 22 31 4 53 4 4
Sample Output
45-1
解题思路:
题目要求的是从1~n的一条路径,满足总路程<=L且淋雨(地上)路程最短,按照这个思路其实就是求一个地上路程的最短路,但这条路要满足总路程<=L的条件。理清思路后,求最短路可以用Dijkstra也可用spfa,只要在入队(加入集合)前判断一下是否能满足总路程<=L就可以了。
Code:
#include <cstdio>#include <iostream>#include <vector>#include <algorithm>#include <cstring>#include <queue>using namespace std;typedef long long LL;const int INF=0x3f3f3f3f;const int maxm=11111;const int maxn=111;struct EdgeNode{ int to; int w; int side;//地上为1,地下为0 int next;};EdgeNode edges[maxm];int N,M;int head[maxn],edge;bool vis[maxn];queue <int> que;int dis[maxn];//记录淋雨(地上)的长度int total[maxn];//记录总长度int n,m1,m2,L;void addedge(int u,int v,int side,int c){ edges[edge].side=side; edges[edge].w=c,edges[edge].to=v,edges[edge].next=head[u],head[u]=edge++;}void init(){ memset(head,-1,sizeof(head)); edge=0;}void spfa(int s,int n)//单源最短路(s为起点,n为节点总数){ int u; for (int i=0; i<=n; i++) { dis[i]=INF; total[i]=INF; } memset(vis,0,sizeof(vis)); while (!que.empty()) que.pop(); que.push(s); vis[s]=true; dis[s]=0; total[s]=0; while (!que.empty()) { u=que.front(); que.pop(); vis[u]=false; for (int i=head[u]; i!=-1; i=edges[i].next) { int v=edges[i].to; int w=edges[i].w; int side=edges[i].side; //总长度小于L,地上距离较小的入队 if (dis[v]>dis[u]+w*side&&total[u]+w<=L) { dis[v]=dis[u]+w*side; total[v]=total[u]+w; if (!vis[v]) { vis[v]=true; que.push(v); } } } }}int main(){ int T; scanf("%d",&T); while(T--) { init(); scanf("%d%d%d%d",&n,&m1,&m2,&L); for(int i=0;i<m1;i++) { int a,b; scanf("%d%d",&a,&b); addedge(a,b,0,1); addedge(b,a,0,1); } for(int i=0;i<m2;i++) { int u,v,c; scanf("%d%d%d",&u,&v,&c); addedge(u,v,1,c); addedge(v,u,1,c); } spfa(1,n); if(dis[n]==INF) printf("-1\n"); else printf("%d\n",dis[n]); } return 0;}
- 计蒜客:热爱工作的蒜蒜(最短路)
- 热爱工作的蒜蒜(带限制最短路)
- 计蒜客&景驰1024-二维最短路&模板-热爱工作的蒜蒜
- 景驰无人驾驶 1024 编程邀请赛 A. 热爱工作的蒜蒜(类似DP的最短路)
- 景驰无人驾驶 1024 编程邀请赛 A.热爱工作的蒜蒜【二维最短路】
- 景驰无人驾驶 1024 编程邀请赛 A.热爱工作的蒜蒜(最短路,SPFA)
- 计蒜客 热爱工作的蒜蒜 spfa+dfs
- 夏天最热爱的水果
- 景驰无人驾驶 1024 编程邀请赛 A 热爱工作的蒜蒜 dijstra
- 从事热爱的工作和积极乐观
- 调整心态热爱你的工作
- 苹果入职信:你会热爱的工作
- 如果这是你热爱的工作
- 如何快速定位自己热爱的工作
- 如何快速定位自己热爱的工作
- 如何快速定位自己热爱的工作
- 最短路(最短路)
- [容易] 最短路实例(有条件的最短路)
- 教大家一个解决PDF文件过大的方法
- jquery-esayui自定义按钮通过ajax请求后台跳转页面
- 05-面向对象(多态-转型)1 05-面向对象(多态-转型)2 05-面向对象(多态-转型)3 05-面向对象(多态-转型)4
- java在具体项目中的优势
- git pull
- 计蒜客:热爱工作的蒜蒜(最短路)
- python学习笔记(三)——常用的内置数据类型
- 阿里云智能对话分析服务使用教程
- ListView的适配器使用方法以及优化类
- 楼主最近遇到一个需求就在在ext 框架里实现右下角弹框提示,就自己动手做了一个
- Numpy的小总结
- PostgreSQL入门到精通——世界上功能最强大的开源数据库
- IOS高德地图点击锚点使锚点位于屏幕中间
- 侧滑菜单-drawerLayout