丢雷。。
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=505;
const int INF=0x3f3f3f3f;
bool vis[maxn];
int G[2][maxn][maxn];
int dis[2][maxn];
int N,M,start,des;;
vector<int>pre[2][maxn];
vector<int>path_len,path_t,temp_path;
void Dij(int index,int id){
memset(vis, 0, sizeof(vis));
dis[id][index]=0;
for (int i=0; i<N; i++) {
int u=-1,min=INF;
for (int j=0; j<N; j++) {
if (vis[j]==0&&dis[id][j]<min) {
min=dis[id][j];
u=j;
}
}
if (u==-1) {
return;
}
vis[u]=1;
for (int j=0; j<N; j++) {
if (vis[j]==0&&G[id][u][j]!=INF) {
if (G[id][u][j]+dis[id][u]<dis[id][j]) {
pre[id][j].clear();
pre[id][j].push_back(u);
dis[id][j]=G[id][u][j]+dis[id][u];
}else if (dis[id][j]==G[id][u][j]+dis[id][u]){
pre[id][j].push_back(u);
}
}
}
}
}
int opt_time=INF,opt_num=INF;
void DFS(int index,int id){
if (index==start) {
temp_path.push_back(index);
if (!id) {
int t=0;
for (int i=(int)temp_path.size()-1; i>0; i--) {
t+=G[1][temp_path[i]][temp_path[i-1]];
}
if (t<opt_time) {
opt_time=t;
path_len=temp_path;
}
}else{
if (temp_path.size()<opt_num) {
opt_num=(int)temp_path.size();
path_t=temp_path;
}
}
temp_path.pop_back();
}
temp_path.push_back(index);
for (int i=0; i<pre[id][index].size(); i++) {
DFS(pre[id][index][i], id);
}
temp_path.pop_back();
}
int main(int argc, const char * argv[]) {
memset(G, 0x3f, sizeof(G));
memset(dis, 0x3f, sizeof(dis));
scanf("%d%d",&N,&M);
int v1,v2,tag,len,t;
for (int i=0; i<M; i++) {
scanf("%d%d%d%d%d",&v1,&v2,&tag,&len,&t);
if (tag) {
G[0][v1][v2]=len;
G[1][v1][v2]=t;
}else{
G[0][v1][v2]=len;
G[0][v2][v1]=len;
G[1][v1][v2]=t;
G[1][v2][v1]=t;
}
}
scanf("%d%d",&start,&des);
Dij(start, 0);
DFS(des, 0);
Dij(start, 1);
DFS(des, 1);
if (path_t==path_len) {
printf("Distance = %d; Time = %d: ",dis[0][des],dis[1][des]);
for (int i=(int)path_t.size()-1; i>=0; i--) {
printf("%d",path_t[i]);
if (i) {
printf(" -> ");
}else{
printf("\n");
}
}
}else{
printf("Distance = %d: ",dis[0][des]);
for (int i=(int)path_len.size()-1; i>=0; i--) {
printf("%d",path_len[i]);
if (i) {
printf(" -> ");
}else{
printf("\n");
}
}
printf("Time = %d: ",dis[1][des]);
for (int i=(int)path_t.size()-1; i>=0; i--) {
printf("%d",path_t[i]);
if (i) {
printf(" -> ");
}else{
printf("\n");
}
}
}
return 0;
}