zoukankan      html  css  js  c++  java
  • libreoj #119. 最短路

    题目描述

    给一个 n(1≤2500≤n) n(1 leq 2500 leq n) n(12500n) 个点 m(1≤6200≤m) m(1 leq 6200 leq m) m(16200m) 条边的无向图,求 s s s 到 t t t 的最短路。

    输入格式

    第一行四个由空格隔开的整数 n n n、m m m、s s s、t t t。
    之后的 m m m 行,每行三个正整数 si s_i si​​、ti t_i ti​​、wi(1≤wi≤109) w_i(1 leq w_i leq 10 ^ 9) wi​​(1wi​​109​​),表示一条从 si s_i si​​ 到 ti t_i ti​​ 长度为 wi w_i wi​​ 的边。

    输出格式

    一个整数表示从 s s s 到 t t t 的最短路长度。数据保证至少存在一条道路。

    样例

    样例输入

    7 11 5 4
    2 4 2
    1 4 3
    7 2 2
    3 4 3
    5 7 5
    7 3 3
    6 1 1
    6 3 4
    2 4 3
    5 6 3
    7 2 1

    样例输出

    7
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #define ll long long 
    
    using namespace std;//2500≤n) 个点 m(1≤6200≤m) m(1 leq 6200 leq m) m(1≤6200≤m) 
    const int B=62100;
    const int D=25100;
    const ll Maxn=99999999;
    
    int head[B];
    int now=1;
    ll dis[D];
    bool vis[D];
    struct node{
        ll u,v,w,nxt;
    }E[B];
    queue<int>q;
    ll n,m,start,endd;
    
    inline ll read()
    {
        ll x=0;char c=getchar();ll f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
        return x*f;
    }
    
    inline void add(int u,int v,int w)
    {
        E[now].u=u;
        E[now].v=v;
        E[now].w=w;
        E[now].nxt=head[u];
        head[u]=now++;
    }
    
    inline void spfa(int start)
    {
        for(int i=1;i<=n;i++)
            dis[i]=Maxn;
        dis[start]=0;
        vis[start]=1;
        q.push(start);
        while(!q.empty())
        {
            int top=q.front();
            q.pop();
            vis[top]=0;
            for(int i=head[top];i!=-1;i=E[i].nxt)
                if(dis[E[i].v]>dis[top]+E[i].w)
                {
                    dis[E[i].v]=dis[top]+E[i].w;
                    if(!vis[E[i].v])
                    {
                        vis[E[i].v]=1;
                        q.push(E[i].v);
                    }    
                }
        }
        printf("%lld",dis[endd]);
    }
    
    int main()
    {
        //freopen("3.in","r",stdin);
        //freopen("3.out","w",stdout);
        n=read();
        m=read();
        start=read();
        endd=read();
        
        for(int i=1;i<=n;i++)
            head[i]=-1;
        for(int i=1;i<=m;i++)
        {
            int u=read();
            int v=read();
            int w=read();
            add(u,v,w);
            add(v,u,w);
        }
        spfa(start);
        return 0;    
    }
     
  • 相关阅读:
    EL表达式具体解释
    Android 实战美女拼图游戏 你能坚持到第几关
    redis sentinel安装及配置(单机版)
    ElasticSearch scroll查询 api
    springboot自动配置原理
    kafka实践
    Springboot mybatis
    计算机原理
    快速排序算法
    maven常见报错问题
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/7115790.html
Copyright © 2011-2022 走看看