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

本文介绍了一种使用Dijkstra算法解决特定图论问题的方法,通过两次运行该算法来找到图中所有节点到指定节点X的最短路径之和的最大值。首先进行一次Dijkstra算法计算从X出发到其他所有节点的距离,再进行一次计算从所有节点到达X的距离。

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\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

 

转载于:https://www.cnblogs.com/itcsl/p/6668677.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值