题目链接:点击打开链接
题目大意:经典Dijkstra。
解题思路:略。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long ll;
const int maxn=520;
int n,m;
int vis[maxn], dis[maxn], fst[maxn], pre1[maxn], pre2[maxn], num[maxn];
int g[maxn][maxn], fast[maxn][maxn];
vector<int> path1,path2;
int dijkstra1(int s)
{
dis[s]=0, fst[s]=0;
while(1)
{
int mi=INF; s=-1;
for(int i=0;i<n;i++)
if(!vis[i] && dis[i]<mi) mi=dis[i], s=i;
if(s==-1) return 0;
vis[s]=1;
for(int i=0;i<n;i++)
{
if(!vis[i] && mi+g[s][i]<dis[i])
{
dis[i]=mi+g[s][i];
fst[i]=fst[s]+fast[s][i];
pre1[i]=s;
}
else if(!vis[i] && mi+g[s][i]==dis[i] && fst[s]+fast[s][i]<fst[i])
{
fst[i]=fst[s]+fast[s][i];
pre1[i]=s;
}
}
}
}
int dijkstra2(int s)
{
fst[s]=0;
while(1)
{
int mi=INF; s=-1;
for(int i=0;i<n;i++)
if(!vis[i] && fst[i]<mi) mi=fst[i], s=i;
if(s==-1) return 0;
vis[s]=1;
for(int i=0;i<n;i++)
{
if(!vis[i] && mi+fast[s][i]<fst[i])
{
fst[i]=mi+fast[s][i];
num[i]=num[s]+1;
pre2[i]=s;
}
else if(!vis[i] && mi+fast[s][i]==fst[i] && num[s]+1<num[i])
{
num[i]=num[s]+1;
pre2[i]=s;
}
}
}
}
int main()
{
mem(g,INF), mem(fast,INF), mem(dis,INF), mem(pre1,-1), mem(pre2,-1), mem(num,0);
int u,v,t,l,f;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d%d%d%d",&u,&v,&f,&l,&t);
if(f) g[u][v]=l, fast[u][v]=t;
else g[v][u]=g[u][v]=l, fast[v][u]=fast[u][v]=t;
}
scanf("%d%d",&u,&v);
mem(vis,0), mem(fst,INF);
dijkstra1(u);
mem(vis,0), mem(fst,INF);
dijkstra2(u);
int h=v;
while(h!=-1)
{
path1.push_back(h);
h=pre1[h];
}
h=v;
while(h!=-1)
{
path2.push_back(h);
h=pre2[h];
}
if(path1==path2)
{
printf("Distance = %d; Time = %d: ",dis[v],fst[v]);
for(int i=path1.size()-1;i>=0;i--)
printf("%d%s",path1[i],i==0?"\n":" -> ");
}
else
{
printf("Distance = %d: ",dis[v]);
for(int i=path1.size()-1;i>=0;i--)
printf("%d%s",path1[i],i==0?"\n":" -> ");
printf("Time = %d: ",fst[v]);
for(int i=path2.size()-1;i>=0;i--)
printf("%d%s",path2[i],i==0?"\n":" -> ");
}
return 0;
}