四点之间最短路(spfa+优先队列+枚举优化)UESTC1955喜马拉雅山上的猴子
喜马拉雅山上的猴子
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 |
---|---|
|
|
|
|
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>
<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);
}
#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);
}
四点之间最短路(spfa+优先队列+枚举优化)UESTC1955喜马拉雅山上的猴子的更多相关文章
- 有限制的最短路spfa+优先队列
poj1724 ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10751 Accepted: 3952 De ...
- 复习最短路 spfa+dijstra堆优化
题目很简单,, 但是wa了三次,, 用<vector>之前一定要记得clear()...简单说下 spfa的问题 和bell_forman有点类似 每次取出一个点 然后更新 并把更新了的节 ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- ACM学习历程—HDU 2112 HDU Today(map && spfa && 优先队列)
Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线 ...
- 关于SPFA算法的优化方式
关于SPFA算法的优化方式 这篇随笔讲解信息学奥林匹克竞赛中图论部分的求最短路算法SPFA的两种优化方式.学习这两种优化算法需要有SPFA朴素算法的学习经验.在本随笔中SPFA朴素算法的相关知识将不予 ...
- 队列优化dijsktra(SPFA)的玄学优化
转载:大佬博客 最近想到了许多优化spfa的方法,这里想写个日报与大家探讨下 前置知识:spfa(不带任何优化) 由于使用较多 STLSTL ,本文中所有代码的评测均开启 O_2O2 优化 对一些数 ...
- SPFA的小优化
标签:闲扯 SPFA的小优化 1. 向队尾加入元素时,如果它比对首还优,就把把它直接和队首交换. 拿一个双端队列来实现 (手写 , head ,tail STLdeque亲测及其慢) 这个小优化其 ...
- SPFA(Bellman-Ford队列优化)
原理:队列+松弛操作 将源点加入队尾,每一步读取队头顶点u,并将队头顶点u出队(记得消除标记):将与点u相连的所有点v进行松弛操作,如果能更新距离(即令d[v]变小),那么就更新,另外,如果点v没有在 ...
- L - Subway(最短路spfa)
L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...
随机推荐
- IDEA Debug 无法进入断点的解决方法
文章来源: https://studyidea.cn/idea_breakpoint_not_use 前言 某个多模块项目中使用多个版本的 Spring,如 Spring 4,Spring 5,在使用 ...
- K8S入门系列之集群二进制部署-->master篇(二)
组件版本和配置策略 组件版本 Kubernetes 1.16.2 Docker 19.03-ce Etcd 3.3.17 https://github.com/etcd-io/etcd/release ...
- [TCP/IP] 学习TCP/IP协议的笔记
1.我看的视频是https://www.bilibili.com/video/av10610680?from=search&seid=1733008388243131444这位大大的视频讲解. ...
- [Error]Archive for required library: 'C:/Users/fk/.m2/repository/com/sun/xml/bind/jaxb-core/2.2.7/jaxb-core-2.2.7.jar'
Eclipse报错: Description Resource Path Location Type Archive for required library: 'C:/Users/fk/.m2/re ...
- 关于RAID 5的介绍与创建
一.简介 定义: RAID 5是RAID 0和RAID 1的折中方案.RAID 5具有和RAID0相近似的数据读取速度,只是多了一个奇偶校验信息,写入数据的速度比对单个磁盘进行写入操作稍慢.同时由于多 ...
- ArcGIS API For Javascript :如何制作地图切换器
大部分情况下我们开发会使用原生的地图切换器,由于每个项目的页面风格不同,业务场景不同,因此需要做一些样式不同的地图切换器. 首先可以照猫画虎,自己照着地图切换器的样式抄一个,或者看看主流的地图切换器都 ...
- 【SSM】自定义属性配置的使用
首先,建立xxx.properties 文件在resource文件夹中,此处我们自定义的配置文件是oj-config.properties 然后,在applicationContext.xml中注册这 ...
- 使用shiro做权限管理的学习笔记整理
Shiro权限管理 参考:https://www.cnblogs.com/jpfss/p/8352031.html Shiro解决的问题 授权和鉴别的问题:Authenrization(授权) Aut ...
- Docker从入门到实践(4-1)
使用 Docker 镜像 在之前的介绍中,我们知道镜像是 Docker 的三大组件之一. Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像. ...
- linux运维与实践
1.容器云计算节点负载值高,通过top可以看到Load Average:70.1 71.3 70.8,虚拟机有8个cpu: cpu使用率高导致(R状态)? 同时在top中观察一段时间,消耗cpu最 ...