首页 > 其他分享 >dijkstra 建立虚拟源点求最短路

dijkstra 建立虚拟源点求最短路

时间:2023-03-03 11:12:09浏览次数:39  
标签:ci dist idx int 短路 源点 dijkstra 村庄 include

题目:
有 N 个村庄,编号 1 到 N。

村庄之间有 M 条无向道路,第 i 条道路连接村庄 ai 和村庄 bi,长度是 ci。

所有村庄都是连通的。

共有 K 个村庄有商店,第 j 个有商店的村庄编号是 xj。

然后给出 Q 个询问,第 k 个询问给出一个村庄的编号 yk,问该村庄距离最近的商店有多远?

输入格式
第一行包含两个整数 N,M。

接下来 M 行,每行包含三个整数 ai,bi,ci,表示第 i 条道路连接村庄 ai 和村庄 bi,长度是 ci。

再一行包含整数 K。

接下来 K 行,每行包含一个整数 xj,表示第 j 个有商店的村庄编号是 xj。

再一行包含整数 Q。

接下来 Q 行,每行包含一个整数 yk,表示询问编号为 yk 的村庄与其距离最近的商店之间的距离。

输出格式
对于每个询问,输出该询问的结果。

数据范围
2≤N≤105,
N−1≤M≤min(N(N−1)2,105),
1≤Q≤105,
1≤K≤N,
1≤ci≤10000

建立虚拟源点的步骤可以省去,直接将所有的起点入队,距离设置为0。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N = 1e5+10,M = 1e5+10;
typedef pair<int,int> PII;
int e[2*M],ne[2*M],h[N],w[2*M],idx;
int dist[N];
int id[N];
bool st[N];
int n,m;

void add(int a,int b,int c)
{
    e[idx] = b,ne[idx] = h[a],w[idx] =c,h[a] = idx++;
}

int main()
{
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    for(int i = 0; i<m;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c),add(b,a,c);
    }
    int k;
    scanf("%d",&k);
    memset(dist,0x3f,sizeof dist);
    priority_queue<PII,vector<PII>,greater<PII> >heap;
    for(int i = 0;i<k;i++)
    {
        int x;
        scanf("%d",&x);
        dist[x] = 0;
        heap.push({0,x});
    }
    
    while(heap.size())
    {
        auto t= heap.top();
        heap.pop();
        int ver = t.second,distance = t.first;
        if(st[ver]) continue;
        st[ver] = true;
        for(int i = h[ver];~i;i=ne[i])
        {
            int j =e[i];
            if(dist[j]>distance+w[i])
            {
                dist[j] = distance+w[i];
                heap.push({dist[j],j});
            }
        }
    }
    int q;
    scanf("%d",&q);
    while(q--)
    {
        int x;
        scanf("%d",&x);
        printf("%d\n",dist[x]);
    }
    return 0;
}

标签:ci,dist,idx,int,短路,源点,dijkstra,村庄,include
From: https://www.cnblogs.com/freshman666/p/17174839.html

相关文章

  • 最短路
    概述最短路算法主要研究图上两点之间的最短路径问题。事实上,许多问题都能转化为图来求解(图的本质就是点和边的集合,点是元素,边是元素之间的二元关系)。所以最短路算......
  • 6366. 在网格图中访问一个格子的最少时间(dijkstra在矩阵上的运用)
    题目https://leetcode.cn/problems/minimum-time-to-visit-a-cell-in-a-grid/description/思路首先,这是一个最短路问题直接用朴素记忆化搜索或者bfs无法实现“反复......
  • 最短路问题
    最短路问题图论中求某点到某点最短的路径长度。图中点1到点4的最短路径长度应为3.分类最短路问题分为两类:单源最短路和多源最短路。前者只需要求一个固定的起点到各个......
  • Johnson 全源最短路 学习笔记
    我居然不会这玩意,过来学一下。算法简介Johnson全源最短路用于求一个带负权的图的任意两点之间的最短路,时间复杂度为\(\Theta(nm\logm)\)。算法流程考虑到\(n\)次......
  • hihoCoder 1081 : 最短路径·一
    #1081:最短路径·一10000ms1000ms256MB描述万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一天——他们决定去闯鬼屋!在鬼屋门......
  • hihoCoder 1089 : 最短路径·二:Floyd算法
    #1089:最短路径·二:Floyd算法10000ms1000ms256MB描述万圣节的中午,小Hi和小Ho在吃过中饭之后,来到了一个新的鬼屋!鬼屋中一共有N个地点,分别编号为1..N,这N个地点之......
  • 图的最短路径算法
    1.不带权值的最短路径对于不带权值的最短路径而言,我们可以采用广度优先遍历的方法,同时在遍历的过程中记录其上一个节点即可。如下图所示,我们找寻从A顶点到H顶点的最短......
  • 「AcWing学习记录」Dijkstra
    AcWing849.Dijkstra求最短路I原题链接朴素Dijkstra1.dis[1]=0,dis[i]=\(+\infty\)2.for(inti=0;i<n;i++)s:当前已确定最短距离的点t\(\leftarrow\)......
  • E. Nearest Opposite Parity(多源最短路bfs)
    题目NearestOppositeParity(多源最短路bfs)题意思路多源最短路代码constintN=2e5+10;inta[N];vector<int>edge[N];intdist[N];intans[N];voidbf......
  • Dijkstra的matlab实现
    任务描述:生成20x20个点,使用Dijkstra算法让找出点(1,1)到(20,20)的最短路径,期中有随机的120个点是不通的,这120个点不包括起点和终点随机五次的实验结果图,代码在后面1.F......