正向建图,反向建图,两次最短路
Dijkstra邻接矩阵
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1010;
int n,m,x;
int g[N][N],rg[N][N],dist[N],rdist[N];
bool st[N];
void dijkstra(int a[N][N],int dist[])
{
memset(st,false,sizeof st);
dist[x]=0;
for(int i=0;i<n-1;i++)
{
int t=-1;
for(int j=1;j<=n;j++)
if(!st[j]&&(t==-1||dist[t]>dist[j]))
t=j;
st[t]=true;
for(int j=1;j<=n;j++)
dist[j]=min(dist[j],dist[t]+a[t][j]);
}
}
int main()
{
memset(g,0x3f,sizeof g);
memset(rg,0x3f,sizeof rg);
memset(dist,0x3f,sizeof dist);
memset(rdist,0x3f,sizeof rdist);
cin>>n>>m>>x;
for(int i=0;i<m;i++)
{
int a,b,c;cin>>a>>b>>c;
g[a][b]=min(g[a][b],c);
rg[b][a]=min(rg[b][a],c);
}
dijkstra(g,dist);
dijkstra(rg,rdist);
int res=0;
for(int i=1;i<=n;i++) res=max(res,dist[i]+rdist[i]);
cout<<res<<endl;
return 0;
}
Dijkstra邻接表
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int,int>PII;
const int N = 1010, M = 200010;
int h[N],rh[N],e[M],ne[M],w[M],idx;
int d[N],rd[N],n,m,x;
bool st[N];
void add(int h[],int a,int b,int c)
{
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void dijkstra(int h[], int d[])
{
memset(st,false,sizeof st);
d[x]=0;
priority_queue<PII,vector<PII>,greater<PII> >heap;
heap.push((PII){0,x});
while(heap.size())
{
PII t=heap.top();heap.pop();
int ver=t.second, distance = t.first;
if(st[ver]) continue;
st[ver]=true;
for(int i=h[ver];~i;i=ne[i])
{
int j=e[i];
if(d[j]>distance+w[i])
{
d[j]=distance+w[i];
heap.push((PII){d[j],j});
}
}
}
}
int main()
{
memset(h,-1,sizeof h);
memset(rh,-1,sizeof rh);
memset(d,0x3f,sizeof d);
memset(rd,0x3f,sizeof rd);
cin>>n>>m>>x;
while(m--)
{
int a,b,c;cin>>a>>b>>c;
add(h,a,b,c),add(rh,b,a,c);
}
dijkstra(h,d);
dijkstra(rh,rd);
int res=0;
for(int i=1;i<=n;i++) res=max(res,d[i]+rd[i]);
cout<<res<<endl;
return 0;
}
Spfa邻接表
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int,int>PII;
const int N = 1010, M = 200010;
int h[N],rh[N],e[M],ne[M],w[M],idx;
int d[N],rd[N],n,m,x;
bool st[N];
void add(int h[],int a,int b,int c)
{
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void Spfa(int h[], int d[])
{
queue<int> q;
memset(st,false,sizeof st);
d[x]=0;
q.push(x);
st[x]=true;
while(!q.empty())
{
int t=q.front();q.pop();
st[t]=false;
for(int i=h[t];~i;i=ne[i])
{
int j=e[i];
if(d[j]>d[t]+w[i])
{
d[j]=d[t]+w[i];
if (!st[j])
{
q.push(j);
st[j]=true;
}
}
}
}
}
int main()
{
memset(h,-1,sizeof h);
memset(rh,-1,sizeof rh);
memset(d,0x3f,sizeof d);
memset(rd,0x3f,sizeof rd);
cin>>n>>m>>x;
while(m--)
{
int a,b,c;cin>>a>>b>>c;
add(h,a,b,c),add(rh,b,a,c);
}
Spfa(h,d);
Spfa(rh,rd);
int res=0;
for(int i=1;i<=n;i++) res=max(res,d[i]+rd[i]);
cout<<res<<endl;
return 0;
}