Metropolis

https://www.nowcoder.com/acm/contest/203/I

题目描述

魔方国有n座城市,编号为。城市之间通过n-1条无向道路连接,形成一个树形结构。
在若干年之后,其中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

≤ n,1 ≤ l

≤ 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

-->

示例1

输入

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(多源点最短路)的更多相关文章

  1. 牛客国庆集训派对Day3 I Metropolis

    Metropolis 思路: 多源点最短路 只要两个不同源点的最短路相遇,我们就更新两个源点的答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3 ...

  2. 最短路模板|堆优化Dijkstra,SPFA,floyd

    Ⅰ:Dijkstra单源点最短路 1.1Dijkstra const int MAX_N = 10000; const int MAX_M = 100000; const int inf = 0x3f ...

  3. 【NOIP复习】最短路总结

    [模板] /*堆优化Dijkstra*/ void dijkstra() { priority_queue<pair<ll,int>,vector<pair<ll,int ...

  4. 沈阳网络赛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 ...

  5. POJ 3268 Silver Cow Party(最短路&Dijkstra)题解

    题意:有n个地点,有m条路,问从所有点走到指定点x再走回去的最短路中的最长路径 思路:用Floyd超时的,这里用的Dijkstra. Dijkstra感觉和Prim和Kruskal的思路很像啊.我们把 ...

  6. 关于dijkstra的优化 及 多源最短路

    先来看这样一道题目 给你N个点,M条双向边,要求求出1号点到其他所有点的距离.其中 2 <= N <= 1e5,  1 <=M <= 1e6. 对于这样的一道题目 我们当然不可 ...

  7. 最短路算法 Dijkstra 入门

    dijkstra算法 是一种单源点最短路算法求出一个点到其他所有点的最短路. 给你这样的一个图,需要求出1号点到其他点的最短距离是多少. 首先我们开一个数组 d[N],d[x] 代表着从起点出发到x点 ...

  8. 算法专题 | 10行代码实现的最短路算法——Bellman-ford与SPFA

    今天是算法数据结构专题的第33篇文章,我们一起来聊聊最短路问题. 最短路问题也属于图论算法之一,解决的是在一张有向图当中点与点之间的最短距离问题.最短路算法有很多,比较常用的有bellman-ford ...

  9. xf浅谈_最短路

    最短路问题(short-path problem):最短路问题是图论研究中的一个经典算法问题,指在寻找图(由结点和路径组成的)中两结点之间的最短路径.算法具体的形式包括: 1.确定起点的最短路径问题 ...

随机推荐

  1. 杂项-frame:Rails框架

    ylbtech-杂项-frame:Rails框架 Rails框架首次提出是在2004年7月,它的研发者是26岁的丹麦人David Heinemeier Hansson.不同于已有复杂的Web 开发框架 ...

  2. Linux-Zabbix

    ###############################安装######################################## 安装部分我写了文档,可能不是很完善 文档如下→→ [ ...

  3. ROS-RouterOS 的license注册级别

    原文: https://wiki.mikrotik.com/wiki/Manual:CHR#CHR_Licensing https://wiki.mikrotik.com/wiki/Manual:Li ...

  4. js在table指定tr行上或底下添加tr行

    js在table指定tr行上或下面添加tr行 function onAddTR(trIndex)         {             var tb = document.getElementB ...

  5. 长沙雅礼中学集训-------------------day3

    今天的收获还是蛮大的,终于体会了一波在知识的海洋中遨游的美滋滋的快感. T1:给你N个点的位置和他们的速度,这些点向一个方向移动,求前M次超越者的集合A和被超越者的集合B(集合为这些点的速度),以及从 ...

  6. DIY-组装

    DIY:-组装 组装,现在基本什么都可以组装,就像计算机,手机,自己进行定制,同样操作系统可以自己组装,软件开发也要组装,现在就是一个DIY的时代. 大家了解DIY,说白了就是自己定制组装一些东西,比 ...

  7. Python print函数参数详解

    官方文档 print(…)    print(value, …, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)    Prints the valu ...

  8. 数据库之SQL笛卡尔积

    1.笛卡尔积定义 笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join).所有连接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据任意组合,上图中两个表 ...

  9. 网络层-IP地址

    以下内容是IPv4 IP地址长度32位,Java里面一个int的长度,总共分为5类IP地址 1:分类编址 A类IP地址0开头:           A类有31个位置可以变化,总数是2^31个, [(0 ...

  10. CUDA C Programming Guide 在线教程学习笔记 Part 10【坑】

    ▶ 动态并行. ● 动态并行直接从 GPU 上创建工作,可以减少主机和设备间数据传输,在设备线程中调整配置.有数据依赖的并行工作可以在内核运行时生成,并利用 GPU 的硬件调度和负载均衡.动态并行要求 ...