zoukankan      html  css  js  c++  java
  • P3371 【模板】单源最短路径(弱化版)

    题目描述

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

    输入输出格式

    输入格式:

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

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

    输出格式:

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

    说明

    时空限制:1000ms,128M

    数据规模:

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

    对于40%的数据:N<=50,M<=2500

    对于70%的数据:N<=500,M<=10000

    对于100%的数据:N<=5000,M<=200000

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<algorithm>
     5 #include<cstring>
     6 using namespace std;
     7 
     8 const int maxn=10005;
     9 const int maxm=50005;
    10 const int inf=2147483647;
    11 
    12 int n,m,s;
    13 int tot;
    14 int head[maxn],dis[maxn],vis[maxn];
    15 
    16 struct Edge{
    17     int next,to;
    18     int wei;
    19 }edge[maxm];
    20 
    21 
    22 void add(int x,int y,int z){
    23        tot++;
    24        edge[tot].to=y;
    25        edge[tot].wei=z;
    26        edge[tot].next=head[x];
    27        head[x]=tot;//顺序!!!!!! 
    28        
    29 }
    30 
    31 void spfa()
    32 {
    33        queue<int> q;
    34        for (int i = 1; i <= n; ++i) dis[i] = inf;
    35        //memset(dis,inf,sizeof(dis));
    36        dis[s]=0;
    37        q.push(s);
    38        vis[s]=1;
    39        
    40        while(!q.empty()){
    41            int u=q.front();
    42            q.pop();
    43            vis[u]=0;
    44            
    45         for(int i=head[u];i;i=edge[i].next)
    46            {
    47                
    48                   int v=edge[i].to;
    49                       if(dis[v]>dis[u]+edge[i].wei)
    50                          {
    51                      dis[v]=dis[u]+edge[i].wei;
    52                           if(!vis[v]){
    53                                  vis[v]=1;
    54                                  q.push(v);
    55                      }
    56                    }
    57         }
    58     }
    59 
    60 
    61 }
    62 
    63 
    64 int main(){
    65    cin>>n>>m>>s;
    66    
    67    int x,y,z;
    68    for(int i=1;i<=m;i++){
    69        cin>>x>>y>>z;
    70        add(x,y,z);
    71     }
    72 
    73    spfa();
    74 
    75   
    76    for(int i=1;i<=n;i++)
    77    {
    78     if(s==i) cout<<0<<" ";
    79     else cout<<dis[i]<<" ";
    80    }
    81 
    82    return 0;
    83 }
  • 相关阅读:
    最近写代码的风格,请帮忙分析下优缺点
    jQuery的回调管理机制(三)
    jQuery的回调管理机制(二)
    jQuery的回调管理机制
    iOS组件化
    iOS内存泄漏检测及分析
    iOS 路由
    iOS https抓包工作记录
    第二章 算法入门
    第一章 算法在计算中的作用
  • 原文地址:https://www.cnblogs.com/nvwang123/p/10806082.html
Copyright © 2011-2022 走看看