zoukankan      html  css  js  c++  java
  • 单源最短路径

    单源最短路径

    https://www.luogu.org/problemnew/show/P3371

    题目背景

    本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779

    题目描述

    如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

    输入输出格式

    输入格式:

    第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。

    接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。

    输出格式:

    一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647)

    输入输出样例

    输入样例#1: 
    4 6 1
    1 2 2
    2 3 2
    2 4 1
    1 3 5
    3 4 3
    1 4 4
    输出样例#1: 
    0 2 4 3

    说明

    时空限制:1000ms,128M

    数据规模:

    对于20%的数据:N<=5,M<=15;

    对于40%的数据:N<=100,M<=10000;

    对于70%的数据:N<=1000,M<=100000;

    对于100%的数据:N<=10000,M<=500000。保证数据随机。

    对于真正 100% 的数据,请移步 P4779。请注意,该题与本题数据范围略有不同。

    最短路模板题

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<string>
     6 #include<cmath>
     7 #include<vector>
     8 #include<queue>
     9 #define maxn 200005
    10 #define INF 0x3f3f3f3f3f3f3f3f
    11 using namespace std;
    12 
    13 int n,m,k;
    14 struct sair{
    15     long long len,pos;
    16     friend bool operator<(sair a,sair b){
    17         return a.len>b.len;
    18     }
    19 };
    20 long long dis[maxn];
    21 long long vis[maxn];
    22 vector<pair<long long,long long> >v[maxn];
    23 void Dijstra(){
    24     priority_queue<sair>q;
    25     sair tmp;
    26     tmp.len=0,tmp.pos=k;
    27     dis[k]=0;
    28     q.push(tmp);
    29     while(!q.empty()){
    30         tmp=q.top();
    31         q.pop();
    32         long long pos=tmp.pos;
    33         if(vis[pos]){
    34             continue;
    35         }
    36         vis[pos]=1;
    37         for(int i=0;i<v[pos].size();i++){
    38             long long f=v[pos][i].first;
    39             long long len=v[pos][i].second;
    40 
    41             if(dis[f]>dis[pos]+len){
    42                 dis[f]=dis[pos]+len;
    43                 tmp.pos=f;
    44                 tmp.len=dis[f];
    45                 q.push(tmp);
    46             }
    47         }
    48     }
    49 }
    50 
    51 
    52 
    53 int main(){
    54 
    55     std::ios::sync_with_stdio(false);
    56     int t;
    57     cin>>n>>m>>k;
    58     for(int i=0;i<=n;i++){
    59         for(int j=0;j<=k;j++){
    60             dis[i]=INF;
    61             vis[i]=0;
    62         }
    63     }
    64     for(int i=0;i<=n;i++){
    65         v[i].clear();
    66     }
    67     int a,b,c;
    68     int j;
    69     for(int i=1;i<=m;i++){
    70         cin>>a>>b>>c;
    71         v[a].push_back(make_pair(b,c));
    72     }
    73     Dijstra();
    74     for(int i=1;i<=n;i++){
    75         if(k==i){
    76             cout<<0;
    77         }
    78         else if(dis[i]==INF){
    79             cout<<2147483647;
    80         }
    81         else{
    82             cout<<dis[i];
    83         }
    84         if(i!=n) cout<<" ";
    85     }
    86     cout<<endl;
    87 
    88 }
    View Code
  • 相关阅读:
    SpringBoot + redis + @Cacheable注解实现缓存清除缓存
    Linux常用命令
    Java8 Stream分组
    VMware CentOS网络配置(局域网其它主机可访问Linux虚拟机)
    Jenkins实现自动打包,MAVEN打包,Shell脚本启动
    Docker常用命令,Docker安装Nginx、Redis、Jenkins、tomcat、MySQL
    Postman配置Pre-request scripts预请求对请求进行AES加密
    《Java并发编程的艺术》并发编程的基础(四)
    linux shell的创建与启动
    《Java并发编程的艺术》Java内存模型(三)
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/9904913.html
Copyright © 2011-2022 走看看