喜马拉雅山上的猴子

Time Limit: 1000 MS     Memory Limit: 256 MB

Submit Status

余周周告诉我喜马拉雅山上有猴子,他们知道点石成金的方法。我不信,于是余周周带我去喜马拉雅山拜访猴子。

喜马拉雅山上有n个猴子聚落,不妨叫它们1,2,…n号聚落;它们之间有m条单向道路(这意味着如果一条路从1号聚落到2号聚落,那么你不能通过这条路从2号聚落到1号聚落),每条道路连接2个聚落,且拥有不同的长度。可能有两条道路的起点和终点相同,但没有一条道路的起点和终点是同一个聚落。

因为急切的想要知道点石成金的方法,余周周只想拜访四个猴子聚落,不妨按拜访顺序将它们记为A、B、C、D。当然,为了节省体力,余周周在这些城市(ABCD)之间旅行时会选择最短的路径。不过,喜马拉雅山上的风景不错,所以余周周想要多停留一会,让旅行过程当中经过的路径总长度最长。

余周周觉得自己制定旅行计划太麻烦,于是把任务交给了你。你需要帮她决定ABCD四个聚落的编号以及访问顺序,以满足余周周的要求。

Input

第一行两个整数n,m(4 ≤ n ≤ 1000, 3 ≤ m ≤ 2000), 表示喜马拉雅山上聚落的数量和单向道路的数量。

接下来m行,每行三个整数x,y,z( 1≤ x,y ≤ n, x≠y,  1 ≤ z ≤ 5000 ),表示从x到y有一条距离为z的单向道路。

输入数据保证题目有解。

Output

输出四个整数a,b,c,d,表示你选择的四个聚落的编号,按照访问顺序输出。

a,b,c,d应该各不相同。

如果有多组满足条件的答案,则输出任意一组答案。

Sample input and output

Sample Input Sample Output
4 6
1 2 1
2 3 1
3 4 1
1 3 1
1 4 1
2 4 1
1 2 3 4
6 12
1 6 4
3 4 5
3 2 1
3 1 2
6 5 2
4 5 1
2 5 5
5 3 1
2 3 2
5 1 2
6 2 4
4 1 5
1 2 6 4

Hint

样例1:12,23,34之间的最短路距离都为1,总距离为3,显然最长。

样例2:可能有其他正确答案。

Source

2018 UESTC ACM Training for Graph Theory

题解:最短路问题,找出距离最短的4个点。可以利用spfa最短路解决。A,B,C,D  4个点,显然枚举B,C两点到其他点的最短距离,然后3段加起来,每次 保留最小值即可;可以利用优先队列优化,只要取出前3即可;

AC代码为:

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdio>
using namespace std;
const int INF = 50000000;
struct part {int ends, data, next;
};struct Info {int id, v;bool operator > (const Info &a) const{return a.v < v;}bool operator < (const Info &a) const{return a.v > v;}
};
vector<Info> s[2000], s1[2000];
struct part e[3000];
int i, j, cnt, max1, n, m, x, y, z, ii, jj, a, b, c, d, v, dis[1010][1010], st[3000];
void combine(int x, int y, int z)
{cnt += 1;e[cnt].ends = y;e[cnt].data = z;e[cnt].next = st[x];st[x] = cnt;
}void spfa(int t)
{for (int i = 1; i <= n; i++) dis[t][i] = INF;dis[t][t] = 0;queue<int> Q;Q.push(t);while (!Q.empty()){int u = Q.front();Q.pop();for (int i = st[u]; i != -1; i = e[i].next){int v = e[i].ends;int w = e[i].data;if (dis[t][v]>dis[t][u] + w){dis[t][v] = dis[t][u] + w;Q.push(v);}}}
}int main()
{cin >> n >> m;for (i = 1; i <= n; i++)st[i] = -1;cnt = 0;for (i = 1; i <= m; i++){cin >> x >> y >> z;combine(x, y, z);}for (i = 1; i <= n; i++) spfa(i);for (i = 1; i <= n; i++){for (j = 1; j <= n; j++)if (dis[i][j] != INF) s[i].push_back(Info {j,dis[i][j]});}for (j = 1; j <= n; j++){for (i = 1; i <= n; i++)if (dis[i][j] != INF) s1[j].push_back(Info {i,dis[i][j]});}for (i = 1; i <= n; i++){sort(s[i].begin(), s[i].end(), greater<Info>());sort(s1[i].begin(), s1[i].end(), greater<Info>());}max1 = -10000;for (i = 1; i <= n; i++){for (j = 1; j <= n; j++)if (i != j && dis[i][j] != INF){v = 0;for (size_t it = 0; it<s1[i].size(); it++){for (size_t itt = 0; itt<s[j].size(); itt++)if (s1[i][it].id != s[j][itt].id&&s1[i][it].id != i && s1[i][it].id != j && i != s[j][itt].id&&j != s[j][itt].id){if (s1[i][it].v + dis[i][j] + s[j][itt].v>max1){max1 = s1[i][it].v + dis[i][j] + s[j][itt].v;a = s1[i][it].id;b = i;c = j;d = s[j][itt].id;}v = 1;break;}if (v == 1) break;}}}printf("%d %d %d %d\n", a, b, c, d);return(0);
}<iostream>
#include<queue>
#include<algorithm>
#include<cstdio>
using namespace std;
const int INF = 50000000;
struct part {int ends, data, next;
};struct Info {int id, v;bool operator > (const Info &a) const{return a.v < v;}bool operator < (const Info &a) const{return a.v > v;}
};
vector<Info> s[2000], s1[2000];
struct part e[3000];
int i, j, cnt, max1, n, m, x, y, z, ii, jj, a, b, c, d, v, dis[1010][1010], st[3000];
void combine(int x, int y, int z)
{cnt += 1;e[cnt].ends = y;e[cnt].data = z;e[cnt].next = st[x];st[x] = cnt;
}void spfa(int t)
{for (int i = 1; i <= n; i++) dis[t][i] = INF;dis[t][t] = 0;queue<int> Q;Q.push(t);while (!Q.empty()){int u = Q.front();Q.pop();for (int i = st[u]; i != -1; i = e[i].next){int v = e[i].ends;int w = e[i].data;if (dis[t][v]>dis[t][u] + w){dis[t][v] = dis[t][u] + w;Q.push(v);}}}
}int main()
{cin >> n >> m;for (i = 1; i <= n; i++)st[i] = -1;cnt = 0;for (i = 1; i <= m; i++){cin >> x >> y >> z;combine(x, y, z);}for (i = 1; i <= n; i++) spfa(i);for (i = 1; i <= n; i++){for (j = 1; j <= n; j++)if (dis[i][j] != INF) s[i].push_back(Info {j,dis[i][j]});}for (j = 1; j <= n; j++){for (i = 1; i <= n; i++)if (dis[i][j] != INF) s1[j].push_back(Info {i,dis[i][j]});}for (i = 1; i <= n; i++){sort(s[i].begin(), s[i].end(), greater<Info>());sort(s1[i].begin(), s1[i].end(), greater<Info>());}max1 = -10000;for (i = 1; i <= n; i++){for (j = 1; j <= n; j++)if (i != j && dis[i][j] != INF){v = 0;for (size_t it = 0; it<s1[i].size(); it++){for (size_t itt = 0; itt<s[j].size(); itt++)if (s1[i][it].id != s[j][itt].id&&s1[i][it].id != i && s1[i][it].id != j && i != s[j][itt].id&&j != s[j][itt].id){if (s1[i][it].v + dis[i][j] + s[j][itt].v>max1){max1 = s1[i][it].v + dis[i][j] + s[j][itt].v;a = s1[i][it].id;b = i;c = j;d = s[j][itt].id;}v = 1;break;}if (v == 1) break;}}}printf("%d %d %d %d\n", a, b, c, d);return(0);
}

转载于:https://www.cnblogs.com/songorz/p/9386761.html

四点之间最短路(spfa+优先队列+枚举优化)UESTC1955喜马拉雅山上的猴子相关推荐

  1. spfa(STL写法)简单讲解+最短路(spfa)例题 acm寒假集训日记22/1/7

    前言:SPFA(Shortest Path Faster Algorithm)算法是求单源最短路线的一种算法,它是Bellman-ford的队列优化,它是一种十分高效的最短路算法. spfa 其实可以 ...

  2. ACM学习历程—HDU 2112 HDU Today(map spfa 优先队列)

    Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线 ...

  3. 队列优化dijsktra(SPFA)的玄学优化

    转载:大佬博客 最近想到了许多优化spfa的方法,这里想写个日报与大家探讨下 前置知识:spfa(不带任何优化) 由于使用较多 STLSTL ,本文中所有代码的评测均开启 O_2O2​ 优化 对一些数 ...

  4. 【牛客每日一题】 4.13 Xorto(前缀异或和,枚举优化/映射)

    链接:https://ac.nowcoder.com/acm/problem/14247 来源:牛客网 题目描述 给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为 ...

  5. 洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

    洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点 那么说明不符合要求 需要 ...

  6. POJ1722二维spfa+优先队列优化

    题意:      给你一个有向图,然后求从起点到终点的最短,但是还有一个限制,就是总花费不能超过k,也就是说每条边上有两个权值,一个是长度,一个是花费,求满足花费的最短长度. 思路:       一开 ...

  7. 最短路[Dijkstra和堆优化的Dijkstra][Bellman-Ford和SPFA][Floyd最短路](更新中)

    文章目录 第一类:单源最短路 一 所有边权都是正数(Dijkstra) 朴素版Dijkstra(稠密图) 堆优化版Dijkstra(稀疏图) 二 存在负权边(BF和SPFA) 第二类:多源汇最短路(F ...

  8. SPFA求最短路——Bellman-Ford算法的优化

    SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同,为 O(VE), ...

  9. 图论最短路:Bellman-Ford与其优化SPFA算法的一点理解

    文章目录 前言 一.对Bellman-Ford的深入理解 1. Bellman-Ford有什么用? 2. 什么是松弛操作? 3. Bellman-Ford的k次迭代意义? 4. 一个重要定理 5. 对 ...

最新文章

  1. 18.11 LVS DR模式搭建 18.12 keepalived + LVS
  2. linux 动态执行cp,Linux常用命令之cp、mv、rm、cat、more、head、tail、ln命令讲解
  3. [转载]Programming MS Office 2000 Web Components第二章第三节
  4. eclipse没有java web,Eclipse Juno在Dynamic Web Project中没有JSP(但其他一切都很好)
  5. 心跳脑裂解决方案之Heartbeat的Stonith配置
  6. mybatis中的自动提交事务的设置
  7. 解决灵格斯强制更新问题
  8. 图像质量评价(IQA)综述
  9. 1082 射击比赛(JAVA)
  10. 渗透基础学习-信息搜集
  11. 《启示录:打造用户喜爱的产品》第一部分 人员5 产品管理与软件开发
  12. 在Firefox安装selenium
  13. Java中catch和throw同时使用
  14. 7月火影忍者服务器维护,火影忍者手游7月8日更新到几点?7.8停服更新维护公告...
  15. 如何从零搭建自动化测试框架
  16. JavaScript 中 let 的使用
  17. 网易云播放失败,请在设置中切换输出设备 解决方案
  18. shell学习18:if判断-e,-f,-f,-L,-r,-w,-x,-s,-nt,-ot的意思
  19. 最简单的8421码计算方法
  20. 智慧职教云答案在哪里找_职教云获取答案软件,智慧职教云答案在哪里找,职教云的答案在哪里找?...

热门文章

  1. 微信小程序(应用号)开发工具+破解+Demo+教程
  2. 英语修辞手法( rhetorical devices)
  3. ZCMU-1635- 超大型 LED 显示屏
  4. 使用mybatis-plus时mybatis报错There is no getter for property named ‘xxx‘ in ‘class com.xxx.xxx.xxxMybatis
  5. 32 | KafkaAdminClient:Kafka的运维利器
  6. 分享28个前端优秀项目源码(React+Vue+Node)
  7. python文件操作入门
  8. ctf MISC 学习总结
  9. 资深程序员被逼无奈出来摆摊了,快来捧个人场!
  10. 直播美颜SDK动态贴纸详解