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

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

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

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath> using namespace std;
const int maxn=1e3+;
const int inf=0x3f3f3f3f;
int m1[maxn][maxn];
int m2[maxn][maxn];
int n,m,X;
int dis[maxn];
int dis2[maxn];
int d[maxn];
void Dijkstra1()
{ bool vis[maxn];
memset(dis,inf,sizeof(dis));
dis[X]=;
memset(vis,,sizeof(vis));
int v;
for(int i=;i<n;i++)
{
int m=inf;
for(int k=;k<=n;k++)
{
if(!vis[k]&&dis[k]<m)
{
m=dis[k];
v=k;
}
}
vis[v]=;
for(int k=;k<=n;k++)
{
if(!vis[k]&&m1[v][k]&&dis[v]+m1[v][k]<dis[k])
{
dis[k]=dis[v]+m1[v][k];
}
}
}
} void Dijkstra2()
{ bool vis[maxn];
memset(dis2,inf,sizeof(dis2));
dis2[X]=;
memset(vis,,sizeof(vis));
int v;
for(int i=;i<n;i++)
{
int m=inf;
for(int k=;k<=n;k++)
{
if(!vis[k]&&dis2[k]<m)
{
m=dis2[k];
v=k;
}
}
vis[v]=;
for(int k=;k<=n;k++)
{
if(!vis[k]&&m2[v][k]&&dis2[v]+m2[v][k]<dis2[k])
{
dis2[k]=dis2[v]+m2[v][k];
}
}
}
} int main()
{
scanf("%d%d%d",&n,&m,&X);
int x,y,w;
for(int i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&w);
m1[x][y]=w;
m2[y][x]=w;
}
Dijkstra1();
Dijkstra2();
int ans=;
for(int i=;i<=n;i++)
{
// printf("%d %d\n",dis[i],dis2[i]);
d[i]=dis[i]+dis2[i];
ans=max(ans,d[i]);
}
printf("%d\n",ans);
return ;
}

Dijkstra

上一篇:更新docker镜像


下一篇:MongoDB 与传统关系型数据库mysql比较