• 【洛谷 p3371】模板-单源最短路径(图论)


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

    解法:spfa算法。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<queue>
     6 using namespace std;
     7 typedef long long LL;
     8 
     9 const int N=10010,M=500010;
    10 const LL INF=2147483647;
    11 int n,m,st,len=0;
    12 int vis[N],last[N];
    13 LL dis[N];
    14 struct edge{int x,y,next;LL d;}a[2*M];
    15 queue<int> q;
    16 
    17 void ins(int x,int y,LL d)
    18 {
    19     a[++len].x=x,a[len].y=y,a[len].d=d;
    20     a[len].next=last[x],last[x]=len;
    21 }
    22 void spfa()
    23 {
    24     for (int i=1;i<=n;i++) dis[i]=INF;
    25     memset(vis,0,sizeof(vis));
    26     while (!q.empty()) q.pop();
    27     dis[st]=0, vis[st]=1;
    28     q.push(st);
    29     while (!q.empty())
    30     {
    31       int x=q.front();
    32       q.pop(); vis[x]=0;
    33       for (int i=last[x];i;i=a[i].next)
    34       {
    35         int y=a[i].y;
    36         if (dis[x]+a[i].d<dis[y])
    37         {
    38           dis[y]=dis[x]+a[i].d;
    39           if (!vis[y]) vis[y]=1, q.push(y);
    40         }
    41       }
    42     }
    43 }
    44 int main()
    45 {
    46     scanf("%d%d%d",&n,&m,&st);
    47     int x,y; LL d;
    48     memset(last,-1,sizeof(last));
    49     for (int i=1;i<=m;i++)
    50     {
    51       scanf("%d%d%lld",&x,&y,&d);
    52       ins(x,y,d);
    53     }
    54     spfa();
    55     for (int i=1;i<=n;i++)
    56       printf("%lld ",dis[i]);
    57     printf("
    ");
    58     return 0;
    59 }
  • 相关阅读:
    java final计算
    浅析Java中的final关键字
    easyui
    Java:类与继承
    java中&和&&
    XML
    JSON
    SQL
    selenium
    Metasploit
  • 原文地址:https://www.cnblogs.com/konjak/p/6074090.html
Copyright © 2020-2023  润新知