【算法系列学习】Dijkstra求最短路 [kuangbin带你飞]专题四 最短路练习 D - Silver Cow Party

时间:2023-02-14 08:12:32

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

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

【算法系列学习】Dijkstra求最短路 [kuangbin带你飞]专题四 最短路练习 D - Silver Cow Party【算法系列学习】Dijkstra求最短路 [kuangbin带你飞]专题四 最短路练习 D - Silver Cow Party
 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\n",dis[i],dis2[i]);
93         d[i]=dis[i]+dis2[i];
94         ans=max(ans,d[i]);
95     }
96     printf("%d\n",ans);
97     return 0;
98 }
Dijkstra