Codevs1269 匈牙利游戏
来源:互联网 发布:java代码实现充值功能 编辑:程序博客网 时间:2024/06/16 21:31
题目描述 Description
Welcome to the Hungary Games! The streets of Budapest form a twisted network of one-way streets.
欢迎来到匈牙利游戏!布达佩斯(匈牙利首都)的街道形成了一个弯曲的单向网络。
You have been forced to join a race as part of a “Reality TV” show where you race through these streets, starting at the Sz´echenyi thermal bath (s for short) and ending at the Tomb of G¨ ul Baba (t for short).
你被强制要求参加一个赛跑作为一个TV秀的一部分节目,比赛中你需要穿越这些街道,从s开始,到t结束。
Naturally, you want to complete the race as quickly as possible, because you will get more promo- tional contracts the better you perform.
很自然的,你想要尽快的完成比赛,因为你的比赛完成的越好,你就能得到更多的商业促销合同。
However, there is a catch: any person who is smart enough to take a shortest s-t route will be thrown into the P´alv¨olgyi cave system and kept as a national treasure. You would like to avoid this fate, but still be as fast as possible. Write a program that computes a strictly-second-shortest s-t route.
但是,有一个需要了解的是,如果有人过于聪明找到从s到t的最短路线,那么他就被扔到国家极品人类保护系统中作为一个国家宝藏收藏起来。你显然要避免这种事情的发生,但是也想越快越好。写一个程序来计算一个从s到t的严格次短路线吧。
Sometimes the strictly-second-shortest route visits some nodes more than once; see Sample Input 2 for an example.
有的时候,严格次短路线可能访问某些节点不止一次。样例2是一个例子。
输入描述 Input Description
The first line will have the format N M, where N is the number of nodes in Budapest and M is the number of edges. The nodes are 1,2,…,N; node 1 represents s; node N represents t. Then there are M lines of the form A B L, indicating a one-way street from A to B of length L. You can assume that A != B on these lines, and that the ordered pairs (A,B) are distinct.
第一行包含两个整数N和M,N代表布达佩斯的节点个数,M代表边的个数。节点编号从1到N。1代表出发点s,N代表终点t。接下来的M行每行三个整数A B L,代表有一条从A到B的长度为L的单向同路。你可以认为A不等于B,也不会有重复的(A,B)对。
输出描述 Output Description
Output the length of a strictly-second-shortest route from s to t. If there are less than two possible lengths for routes from s to t, output −1.
输出从s到t的严格次短路的长度。如果从s到t的路少于2条,输出-1。
样例输入 Sample Input
样例输入1:
4 6
1 2 5
1 3 5
2 3 1
2 4 5
3 4 5
1 4 13
样例输入2:
2 2
1 2 1
2 1 1
样例输出 Sample Output
样例输出1:
11
样例输出2:
3
模板题模板题模板题!!!裸的次短路!不多说贴代码。
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <vector>#include <queue>using namespace std;const int maxn=1005000;int n,m;struct edge{ int to,w; edge(int _to,int _w){to=_to;w=_w;}};vector <edge> g[maxn];int x,y,v;int dist1[maxn],dist2[maxn];bool vis[maxn];void spfa(int x){ queue<int> q; memset(dist1,63,sizeof(dist1)); memset(dist2,63,sizeof(dist2)); memset(vis,false,sizeof(vis)); q.push(x); dist1[1]=0; vis[1]=1; while(!q.empty()) { int v=q.front(); q.pop(); vis[v]=0; int l=g[v].size(); for(int i=0;i<l;i++){ int u=g[v][i].to; if(dist1[u]>dist1[v]+g[v][i].w){ dist2[u]=dist1[u]; dist1[u]=dist1[v]+g[v][i].w; if(!vis[u]){vis[u]=1;q.push(u);} } if(dist2[u]>dist2[v]+g[v][i].w){ dist2[u]=dist2[v]+g[v][i].w; if(!vis[u]){vis[u]=1;q.push(u);} } if(dist1[u]<dist1[v]+g[v][i].w && dist2[u]>dist1[v]+g[v][i].w){ dist2[u]=dist1[v]+g[v][i].w; if(!vis[u]){vis[u]=1;q.push(u);} } } }}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&v); g[x].push_back(edge(y,v)); } spfa(1); if(dist2[n]<96409478) cout<<dist2[n]; else cout<<"-1"; return 0;}
- 【codevs1269】匈牙利游戏
- Codevs1269 匈牙利游戏
- [codevs1269] 匈牙利游戏
- Codevs1269 匈牙利游戏 次短路spfa
- codevs1269匈牙利游戏(spfa跑次短路)
- 匈牙利游戏
- wikioi 1269 匈牙利游戏
- 【codevs 1269】匈牙利游戏
- 【codevs 1269】匈牙利游戏
- codevs 1269 匈牙利游戏
- codevs 1269 匈牙利游戏
- 【codevs 1269】匈牙利游戏
- 【codevs 1269】匈牙利游戏
- 棋盘游戏(匈牙利算法)
- SCOI2010游戏[匈牙利算法复习]
- 匈牙利游戏之A*版
- hdu 1281棋盘游戏 匈牙利算法
- 1059: [ZJOI2007]矩阵游戏 (匈牙利)
- 等差数列(线性动归)
- Android SQLite Example
- NVMe驱动解析-响应I/O请求
- SIFT算法详解
- HashTable源码分析
- Codevs1269 匈牙利游戏
- 229. Majority Element II
- 数据库三范式
- java通过jdbc驱动连接hive操作实例
- 使用QSBR进行安全的内存回收
- Codeforces 724B Batch Sort(暴力枚举)
- 从ActionBar切换到toolBar
- 从零开始写一个简单好用的游戏服务器引擎[2] - 跨平台相关
- mybatis+postgresql insert, update or delete returning *问题