哈理工第六届程序设计大赛 I 旅行 (最短路)
2016-11-20 23:15
169 查看
思路:读错题。。比赛的时候没出来。。首先对每个点求一次最短路,然后枚举中间点,排序取前两个大的更新答案就可以了
Submit: 58 Solved: 16
[Submit][Status][Web
Board]
小z放假了,准备到RRR城市旅行,其中这个城市有N个旅游景点。小z时间有限,只能在三个旅行景点进行游玩。小明租了辆车,司机很善良,说咱不计路程,只要你一次性缴费足够,我就带你走遍RRR城。
小z很开心,直接就把钱一次性缴足了。然而小z心机很重,他想选择的路程尽量长。
然而司机也很聪明,他每次从一个点走到另外一个点的时候都走最短路径。
你能帮帮小z吗?
需要保证这三个旅行景点一个作为起点,一个作为中转点一个作为终点。(一共三个景点,并且需要保证这三个景点不能重复).
本题包含多组输入,第一行输入一个整数t,表示测试数据的组数
每组测试数据第一行输入两个数N,M表示RRR城一共有的旅游景点的数量,以及RRR城中有的路的数量。
接下来M行,每行三个数,a,b,c表示从a景点和b景点之间有一条长为c的路
t<=40
3<=N,M<=1000
1<=a,b<=N
1<=c<=100
每组数据输出两行,
每组数据包含一行,输出一个数,表示整条路程的路长。
如果找不到可行解,输出-1.
#include<bits/stdc++.h> using namespace std; const int maxn = 1005; #define inf 1e9 vector<pair<int,int> >e[maxn]; int d[maxn][maxn]; int vis[maxn]; int res[maxn*2]; int n,m; void spfa(int id) { for(int i = 0;i<=n;i++) d[id][i]=inf; d[id][id]=0; queue<int>q; q.push(id); vis[id]=1; while(!q.empty()) { int u = q.front(); q.pop(); vis[u]=0; for(int i = 0;i<e[u].size();i++) { int v = e[u][i].first; int w = e[u][i].second; if(d[id][v]>d[id][u]+w) { d[id][v]=d[id][u]+w; if(!vis[v]) { q.push(v); vis[v]=1; } } } } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i = 0;i<=n;i++)e[i].clear(); for(int i = 1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); e[u].push_back(make_pair(v,w)); e[v].push_back(make_pair(u,w)); } for(int i = 1;i<=n;i++) spfa(i); int ans = -1; for(int i = 1;i<=n;i++) { int cnt = 0; for(int j = 1;j<=n;j++) { if(i==j)continue; if(d[i][j]!=inf) res[cnt++]=d[i][j]; } if(cnt<=1)continue; sort(res,res+cnt); ans = max(ans,res[cnt-1]+res[cnt-2]); } printf("%d\n",ans); } }
Problem I: 旅行
Time Limit: 3 Sec Memory Limit: 32 MBSubmit: 58 Solved: 16
[Submit][Status][Web
Board]
Description
小z放假了,准备到RRR城市旅行,其中这个城市有N个旅游景点。小z时间有限,只能在三个旅行景点进行游玩。小明租了辆车,司机很善良,说咱不计路程,只要你一次性缴费足够,我就带你走遍RRR城。
小z很开心,直接就把钱一次性缴足了。然而小z心机很重,他想选择的路程尽量长。
然而司机也很聪明,他每次从一个点走到另外一个点的时候都走最短路径。
你能帮帮小z吗?
需要保证这三个旅行景点一个作为起点,一个作为中转点一个作为终点。(一共三个景点,并且需要保证这三个景点不能重复).
Input
本题包含多组输入,第一行输入一个整数t,表示测试数据的组数
每组测试数据第一行输入两个数N,M表示RRR城一共有的旅游景点的数量,以及RRR城中有的路的数量。
接下来M行,每行三个数,a,b,c表示从a景点和b景点之间有一条长为c的路
t<=40
3<=N,M<=1000
1<=a,b<=N
1<=c<=100
Output
每组数据输出两行,
每组数据包含一行,输出一个数,表示整条路程的路长。
如果找不到可行解,输出-1.
Sample Input
47 71 2 1002 3 1001 4 44 5 65 6 101 6 46 7 87 31 2 11 3 11 3 27 31 2 13 4 15 6 18 91 2 12 3 13 4 14 1 14 5 15 6 16 7 17 8 18 5 1
Sample Output
4223-19
HINT
请注意这是一个稀疏图.相关文章推荐
- 哈理工第六届程序设计大赛 D 经商 (并查集+背包)
- 哈理工第六届程序设计大赛 G 逃脱(BFS)
- 哈理工第六届程序设计大赛 F 苦逼的单身狗(滑窗)
- 湖南省第六届程序设计大赛D(台球碰撞)
- 南京林业大学“未来之星”第六届程序设计大赛(决赛)试题F 参考代码
- nyoj711&&zznu1624 最舒适的路线(第六届河南省程序设计大赛 广搜)
- 湖南省第六届程序设计大赛D(台球碰撞)
- 湖南省第六届 中信软件教育杯 大学生程序设计大赛试题 第三题 数字整除
- 哈理工 oj 2122 旅行(map + 最短路dij算法)
- NYOJ-716 River Crossing(第六届河南省程序设计大赛)
- nyoj 711最舒适的路线(第六届河南省程序设计大赛 并查集)
- 〖2016〗吉首大学第六届新星杯暨程序设计大赛(新生网络同步赛)-题解
- NYIST 714 异 形 卵(第六届河南省程序设计大赛)
- 河南省第六届程序设计大赛——异形卵
- 第六届程序设计大赛 River Crossing(不懂)
- 第六届程序设计大赛 T1 异形卵
- 南京林业大学“未来之星”第六届程序设计大赛(决赛)试题G 参考代码
- 哈理工软件学院"兆方美迪"杯第六届程序设计大赛【高年级组】--决赛 题解
- 湖南省第六届 中信软件教育杯 大学生程序设计大赛试题 第二题 弟弟的作业
- nyoj 712 探 寻 宝 藏(双线dp 第六届河南省程序设计大赛)