码量充足 题意明确
dfs+spfa解法
#include <bits/stdc++.h>
using namespace std;
#define FORP(i,a,b) for(int i=a;i<=b;i++)
#define db(a) (cout<<"---"<<a<<endl)
#define mp(a,b) make_pair(a,b)
typedef pair<int,int> Pair;
vector<int> v[520];//lenth
int dd[700][700],tt[700][700];
int dist[1000],inq[1000];
void print(vector <int> s){
for(int i=0;i<s.size();++i){
printf(" -> %d",s[i]);
}
printf("\n");
}
void spfa(int x,int type){
memset(dist,0x3f,sizeof(dist));
memset(inq,0,sizeof(inq));
dist[x]=0;
queue<int> q;
q.push(x);
inq[x]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<v[u].size();++i){
int to=v[u][i];
int cost=(type?dd[u][to]:tt[u][to]);
if(dist[u]+cost<dist[to]){
dist[to]=dist[u]+cost;
if(!inq[to]){
inq[to]=1;
q.push(to);
}
}
}
inq[u]=0;
}
}
int vis[1000];
int source,destination;
vector<int> p,a,b;
int Maxt=0x3f3f3f3f;
void dfs(int x,int tot,int t,int type){
if(tot<0) return;
if(tot==0&&x==destination){
if(type){//找最快的
if(t<Maxt){
Maxt=t;
a=p;
}
}
else{//找点数最少的
if(!b.size()) b=p;
else if(p.size()<b.size())
b=p;
}
return;
}
vis[x]=1;
for(int i=0;i<v[x].size();++i){
int to=v[x][i];
int cost=(type?dd[x][to]:tt[x][to]);
if(!vis[to]){
vis[to]=1;
p.push_back(to);
dfs(to,tot-cost,t+tt[x][to],type);
vis[to]=0;
p.pop_back();
}
}
}
int main(){
int n,m;cin>>n>>m;
memset(dd,0x3f,sizeof(dd));
memset(tt,0x3f,sizeof(tt));
FORP(i,1,m){
int from,to,one,len,t;
cin>>from>>to>>one>>len>>t;
v[from].push_back(to);
dd[from][to]=len;
tt[from][to]=t;
if(!one){
v[to].push_back(from);
tt[to][from]=t;
dd[to][from]=len;
}
}
cin>>source>>destination;
spfa(source,1);
int Minlen=dist[destination];
spfa(source,0);
int Mintime=dist[destination];
dfs(source,Minlen,0,1);
dfs(source,Mintime,0,0);
if(a!=b){
printf("Distance = %d: %d",Minlen,source);
print(a);
printf("Time = %d: %d",Mintime,source);
print(b);
}
else{
printf("Distance = %d; Time = %d: %d",Minlen,Mintime,source);
print(a);
}
return 0;
}