zoukankan      html  css  js  c++  java
  • 【算法系列学习】Dijkstra求最短路 [kuangbin带你飞]专题四 最短路练习 D

    https://vjudge.net/contest/66569#problem/D

    trick:1~N各点到X可以通过转置变为X到1~N各点

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<algorithm>
     6 #include<cmath>
     7 
     8 using namespace std;
     9 const int maxn=1e3+5;
    10 const int inf=0x3f3f3f3f;
    11 int m1[maxn][maxn];
    12 int m2[maxn][maxn];
    13 int n,m,X;
    14 int dis[maxn];
    15 int dis2[maxn];
    16 int d[maxn];
    17 void Dijkstra1()
    18 {
    19     
    20     bool vis[maxn];
    21     memset(dis,inf,sizeof(dis));
    22     dis[X]=0;
    23     memset(vis,0,sizeof(vis));
    24     int v;
    25     for(int i=0;i<n;i++)
    26     {
    27         int m=inf;
    28         for(int k=1;k<=n;k++)
    29         {
    30             if(!vis[k]&&dis[k]<m)
    31             {
    32                 m=dis[k];
    33                 v=k;        
    34             }
    35         }
    36         vis[v]=1;
    37         for(int k=1;k<=n;k++)
    38         {
    39             if(!vis[k]&&m1[v][k]&&dis[v]+m1[v][k]<dis[k])
    40             {
    41                 dis[k]=dis[v]+m1[v][k];
    42             }
    43         }
    44     }
    45 }
    46 
    47 void Dijkstra2()
    48 {
    49 
    50     bool vis[maxn];
    51     memset(dis2,inf,sizeof(dis2));
    52     dis2[X]=0;
    53     memset(vis,0,sizeof(vis));
    54     int v;
    55     for(int i=0;i<n;i++)
    56     {
    57         int m=inf;
    58         for(int k=1;k<=n;k++)
    59         {
    60             if(!vis[k]&&dis2[k]<m)
    61             {
    62                 m=dis2[k];
    63                 v=k;        
    64             }
    65         }
    66         vis[v]=1;
    67         for(int k=1;k<=n;k++)
    68         {
    69             if(!vis[k]&&m2[v][k]&&dis2[v]+m2[v][k]<dis2[k])
    70             {
    71                 dis2[k]=dis2[v]+m2[v][k];
    72             }
    73         }
    74     }
    75 }
    76 
    77 int main()
    78 {
    79     scanf("%d%d%d",&n,&m,&X);
    80     int x,y,w;
    81     for(int i=0;i<m;i++)
    82     {
    83         scanf("%d%d%d",&x,&y,&w);
    84         m1[x][y]=w;
    85         m2[y][x]=w;
    86     }
    87     Dijkstra1();
    88     Dijkstra2();
    89     int ans=0;
    90     for(int i=1;i<=n;i++)
    91     {
    92     //    printf("%d %d
    ",dis[i],dis2[i]);
    93         d[i]=dis[i]+dis2[i];
    94         ans=max(ans,d[i]);
    95     }
    96     printf("%d
    ",ans);
    97     return 0;
    98 }
    Dijkstra
  • 相关阅读:
    git 项目代码打包
    jira查看字段
    jmeter压力测试报错:java.net.BindException: Address already in use: connect解决办法
    python 破解验证码
    mysql授权远程登录
    豆瓣api
    利用python开发财务工具
    钉钉发送消息通知
    git使用命令行自动登录
    后宫
  • 原文地址:https://www.cnblogs.com/itcsl/p/6668677.html
Copyright © 2011-2022 走看看