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

    题目背景

    本题测试数据为随机数据,在考试中可能会出现构造数据让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到3和1到4的文字位置调换

    本题根据数据边数m<=500000,邻接矩阵存不下,只能使用静态邻接表存储。

    #include<cstdio>
    #include<queue> 
    using namespace std;
    
    const long long inf=2147483647;
    const int maxn=10005;
    const int maxm=500005;
    using namespace std;
    int n,m,s,num_edge=0;
    int dis[maxn],vis[maxn],head[maxm];
    struct Edge{
      int next,to,dis;
    }edge[maxm];
    
    void add(int from,int to,int dis){ 
      edge[++num_edge].next=head[from]; 
      edge[num_edge].to=to;
      edge[num_edge].dis=dis;
      head[from]=num_edge;
    }
    
    void spfa(){
      queue<int> q;
      for(int i=1; i<=n; i++) {
        dis[i]=inf;
        vis[i]=0;
      }
      q.push(s); dis[s]=0; vis[s]=1;
      while(!q.empty()){
        int u=q.front();
        q.pop(); vis[u]=0;
        for(int i=head[u];i;i=edge[i].next){
          int v=edge[i].to; 
          if(dis[v]>dis[u]+edge[i].dis){
            dis[v]=dis[u]+edge[i].dis;
            if(vis[v]==0){
              vis[v]=1;
              q.push(v);
            }
          }
        }
      }
    }
    
    
    int main(){
        scanf("%d%d%d",&n,&m,&s);
        for(int i=1; i<=m; i++){
            int f,g,w;
            scanf("%d%d%d",&f,&g,&w); 
            add(f,g,w);
        }
        spfa();
        for(int i=1;i<=n;i++){ 
            if(s==i){
                printf("0 ");
            }
            else{
                printf("%d ",dis[i]);
            }
        }
      return 0;
    }
  • 相关阅读:
    转载ORACLE批量绑定FORALL与BULK COLLECT
    Oracle Locking Survival Guide
    转载:TOAD中查看执行计划
    Oracle 9i/10g编程艺术笔记第七章 并发与多版本
    C#调用Oracle存储过程返回多结果集
    转载oracle 字符集查看与修改
    转载:Oracle的优化器(Optimizer)
    Oracle 随笔
    转载:Oracle中SQL语句执行效率的查找与解决
    当查询和设置需要输入Pn时界面的处理方法
  • 原文地址:https://www.cnblogs.com/hrj1/p/11160489.html
Copyright © 2011-2022 走看看