跑两次Dijkstra,最后输出有点啰嗦,太懒了,不想改了
#include <bits/stdc++.h>
using namespace std;
const int N = 500+10;
typedef pair<int,int> PII;
int n,m,k,st,ed;
int u,v,len,op,ti;
int g[N][N],cost[N][N],path[N];
int dist[N],vis[N],dis[N];
int cnt[N],sum[N];//路径中的节点个数和距离
void dijk() {
for(int i=0; i<n; i++) {
path[i] = -1;
vis[i] = 0;
sum[i] = 0;
if(op==1)
dist[i] = 0x3f3f3f3f;
else
dis[i] = 0x3f3f3f3f;
}
dist[st] = 0;
dis[st]=0;
priority_queue<PII>q;
q.push(make_pair(-dist[st],st));
while(!q.empty()) {
int u = q.top().second;
q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i=0; i<n; i++) {
if(!vis[i]) {
if(op==1) {
if(dist[i]>dist[u]+g[u][i]) {
dist[i] = dist[u]+g[u][i];
cnt[i] = cnt[u]+1;
path[i] = u;
q.push(make_pair(-dist[i],i));
}
else if(dist[i]==dist[u]+g[u][i]) {
if(cnt[i]>cnt[u]+1) {
path[i] = u;
cnt[i] = cnt[u]+1;
q.push(make_pair(-dist[i],i));
}
}
}
else {
if(dis[i]>dis[u]+cost[u][i]) {
dis[i] = dis[u]+cost[u][i];
sum[i] = sum[u]+g[u][i];
path[i] = u;
q.push(make_pair(-dis[i],i));
}
else if(dis[i]==dis[u]+cost[u][i]) {
if(sum[i]>sum[u]+g[u][i]) {
sum[i] = sum[u]+g[u][i];
path[i] = u;
q.push(make_pair(-dis[i],i));
}
}
}
}
}
}
}
int main() {
cin>>n>>m;
for(int i=0; i<=n; i++) {
for(int j=0; j<=n; j++) {
if(i==j) continue;
g[i][j] = g[j][i] = 0x3f3f3f3f;
cost[i][j] = cost[j][i] = 0x3f3f3f3f;
}
}
for(int i=1; i<=m; i++) {
cin>>u>>v>>op>>len>>ti;
if(op==1) g[u][v] = len;
else g[u][v] = g[v][u] = len;
cost[u][v] = cost[v][u] = ti;
}
cin>>st>>ed;
cnt[st] = 1;
op=1;
dijk();
int now = ed;
int distance,min_time;
vector<int>ans_p;
while(now!=-1) {
ans_p.push_back(now);
now = path[now];
}
distance = dist[ed];
op=0;
dijk();
vector<int>ans_ti;
now = ed;
while(now!=-1) {
ans_ti.push_back(now);
now = path[now];
}
min_time = dis[ed];
if(ans_p==ans_ti) {
printf("Time = %d; Distance = %d: ",dis[ed],distance);
for(int i=ans_ti.size()-1; i>=0; i--) {
if(i==0) cout<<ans_ti[i]<<endl;
else cout<<ans_ti[i]<<" => ";
}
}
else {
printf("Time = %d: ",min_time);
for(int i=ans_ti.size()-1; i>=0; i--) {
if(i==0) cout<<ans_ti[i]<<endl;
else cout<<ans_ti[i]<<" => ";
}
printf("Distance = %d: ",distance);
for(int i=ans_p.size()-1; i>=0; i--) {
if(i==0) cout<<ans_p[i]<<endl;
else cout<<ans_p[i]<<" => ";
}
}
return 0;
}