Metropolis(多源点最短路)
Metropolis
https://www.nowcoder.com/acm/contest/203/I
题目描述
在若干年之后,其中p座城市发展成了大都会,道路的数量也增加到了m条。
大都会之间经常有贸易往来,因此,对于每座大都会,请你求出它到离它最近的其它大都会的距离。
输入描述:
第一行三个整数n,m,p (1 ≤ n,m ≤ 2*10
5
,2 ≤ p ≤ n),第二行p个整数
表示大都会的编号 (1≤ x
i
≤ n)。接下来m行每行三个整数a
i
,b
i
,l
i
表示一条连接a
i
和b
i
,长度为l
i
的道路 (1 ≤ a
i
,b
i
≤ n,1 ≤ l
i
≤ 10
9
)。
保证图是连通的。
输出描述:
输出一行p个整数,第i个整数表示x
i
的答案。
输入例子:
5 6 3
2 4 5
1 2 4
1 3 1
1 4 1
1 5 4
2 3 1
3 4 3
输出例子:
3 3 5
-->
输入
5 6 3
2 4 5
1 2 4
1 3 1
1 4 1
1 5 4
2 3 1
3 4 3
输出
3 3 5
#include<iostream>
#include<cmath>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 200005
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const ll INF=0x3f3f3f3f3f3f3f3f;
using namespace std; vector<pair<int,ll> >ve[maxn];
int n,p;
int a[maxn],bel[maxn];///离哪个大都会最近
ll dis[maxn];
int vis[maxn];
ll ans[maxn];///求离自己最近的大都会的距离
struct sair{
int pos;
ll len;
friend bool operator<(sair a,sair b){
return a.len>b.len;
}
};
void Dijstra(){
for(int i=;i<=n;i++){
dis[i]=INF;
ans[i]=INF;
vis[i]=;
}
sair s,e;
int pos;
ll len;
priority_queue<sair>Q;
for(int i=;i<=p;i++){
s.len=,s.pos=a[i];
Q.push(s);
dis[a[i]]=;
bel[a[i]]=a[i];
}
while(!Q.empty()){
s=Q.top();
Q.pop();
if(!vis[s.pos]){
vis[s.pos]=;
for(int i=;i<ve[s.pos].size();i++){
pos=ve[s.pos][i].first;
len=ve[s.pos][i].second;
if(dis[pos]>dis[s.pos]+len){
dis[pos]=dis[s.pos]+len;
bel[pos]=bel[s.pos];
e.len=dis[pos];
e.pos=pos;
Q.push(e);
}
else if(bel[pos]!=bel[s.pos]){
///当两个城市属于不同的大都会时,A地到B地的最近距离为A地到K地再到B地的距离
ans[bel[pos]]=min(ans[bel[pos]],dis[pos]+dis[s.pos]+len);
ans[bel[s.pos]]=min(ans[bel[s.pos]],dis[pos]+dis[s.pos]+len);
}
}
}
} } int main(){
std::ios::sync_with_stdio(false);
int m;
cin>>n>>m>>p;
for(int i=;i<=p;i++){
cin>>a[i];
}
int aa,bb,vv;
while(m--){
cin>>aa>>bb>>vv;
ve[aa].push_back(make_pair(bb,vv));
ve[bb].push_back(make_pair(aa,vv));
}
Dijstra();
for(int i=;i<=p;i++){
if(i!=){
cout<<" ";
}
cout<<ans[a[i]];
}
cout<<endl;
}
Metropolis(多源点最短路)的更多相关文章
- 牛客国庆集训派对Day3 I Metropolis
Metropolis 思路: 多源点最短路 只要两个不同源点的最短路相遇,我们就更新两个源点的答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3 ...
- 最短路模板|堆优化Dijkstra,SPFA,floyd
Ⅰ:Dijkstra单源点最短路 1.1Dijkstra const int MAX_N = 10000; const int MAX_M = 100000; const int inf = 0x3f ...
- 【NOIP复习】最短路总结
[模板] /*堆优化Dijkstra*/ void dijkstra() { priority_queue<pair<ll,int>,vector<pair<ll,int ...
- 沈阳网络赛D-Made In Heaven【k短路】【模板】
One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. However, Pucci ...
- POJ 3268 Silver Cow Party(最短路&Dijkstra)题解
题意:有n个地点,有m条路,问从所有点走到指定点x再走回去的最短路中的最长路径 思路:用Floyd超时的,这里用的Dijkstra. Dijkstra感觉和Prim和Kruskal的思路很像啊.我们把 ...
- 关于dijkstra的优化 及 多源最短路
先来看这样一道题目 给你N个点,M条双向边,要求求出1号点到其他所有点的距离.其中 2 <= N <= 1e5, 1 <=M <= 1e6. 对于这样的一道题目 我们当然不可 ...
- 最短路算法 Dijkstra 入门
dijkstra算法 是一种单源点最短路算法求出一个点到其他所有点的最短路. 给你这样的一个图,需要求出1号点到其他点的最短距离是多少. 首先我们开一个数组 d[N],d[x] 代表着从起点出发到x点 ...
- 算法专题 | 10行代码实现的最短路算法——Bellman-ford与SPFA
今天是算法数据结构专题的第33篇文章,我们一起来聊聊最短路问题. 最短路问题也属于图论算法之一,解决的是在一张有向图当中点与点之间的最短距离问题.最短路算法有很多,比较常用的有bellman-ford ...
- xf浅谈_最短路
最短路问题(short-path problem):最短路问题是图论研究中的一个经典算法问题,指在寻找图(由结点和路径组成的)中两结点之间的最短路径.算法具体的形式包括: 1.确定起点的最短路径问题 ...
随机推荐
- 杂项-frame:Rails框架
ylbtech-杂项-frame:Rails框架 Rails框架首次提出是在2004年7月,它的研发者是26岁的丹麦人David Heinemeier Hansson.不同于已有复杂的Web 开发框架 ...
- Linux-Zabbix
###############################安装######################################## 安装部分我写了文档,可能不是很完善 文档如下→→ [ ...
- ROS-RouterOS 的license注册级别
原文: https://wiki.mikrotik.com/wiki/Manual:CHR#CHR_Licensing https://wiki.mikrotik.com/wiki/Manual:Li ...
- js在table指定tr行上或底下添加tr行
js在table指定tr行上或下面添加tr行 function onAddTR(trIndex) { var tb = document.getElementB ...
- 长沙雅礼中学集训-------------------day3
今天的收获还是蛮大的,终于体会了一波在知识的海洋中遨游的美滋滋的快感. T1:给你N个点的位置和他们的速度,这些点向一个方向移动,求前M次超越者的集合A和被超越者的集合B(集合为这些点的速度),以及从 ...
- DIY-组装
DIY:-组装 组装,现在基本什么都可以组装,就像计算机,手机,自己进行定制,同样操作系统可以自己组装,软件开发也要组装,现在就是一个DIY的时代. 大家了解DIY,说白了就是自己定制组装一些东西,比 ...
- Python print函数参数详解
官方文档 print(…) print(value, …, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False) Prints the valu ...
- 数据库之SQL笛卡尔积
1.笛卡尔积定义 笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join).所有连接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据任意组合,上图中两个表 ...
- 网络层-IP地址
以下内容是IPv4 IP地址长度32位,Java里面一个int的长度,总共分为5类IP地址 1:分类编址 A类IP地址0开头: A类有31个位置可以变化,总数是2^31个, [(0 ...
- CUDA C Programming Guide 在线教程学习笔记 Part 10【坑】
▶ 动态并行. ● 动态并行直接从 GPU 上创建工作,可以减少主机和设备间数据传输,在设备线程中调整配置.有数据依赖的并行工作可以在内核运行时生成,并利用 GPU 的硬件调度和负载均衡.动态并行要求 ...