记录一下pat写的最长的代码,格式有点难看,代码长的原因有两个:
一 ,两次dij,这个没办法,我就写了两个方法。
二,两次dfs,我这里的dfs长的原因是,我dij只处理两个问题的第一问,也就是dij只存了最短距离路径和最短时间的路径(多个)。
而那些相等之后的判定,我放在了dfs里面,因为写dij的时候有考虑放一起,但写着写着发现有点不对劲,就索性没写了。
优化的话就这里优化
用了1个小时,因为我上课开始写的,下课刚好写完。
#include<bits/stdc++.h>
using namespace std;
int n,m,be,en,ma=999999;
int g[505][505],g1[505][505];
int len[505],tim[505],vis[505];
vector<int> ans[505],ans1[505];
vector<int> cur1,cur2;
vector<int> ll,rr;
int dis=0,ti=0;
void dij1(){
len[be]=0;
for(int i=0;i<n;i++){
int u=-1;
int mii=999999;
for(int j=0;j<n;j++){
if(!vis[j] && len[j]<mii){
u=j;
mii=len[j];
}
}
if(u==-1) break;
vis[u]=1;
for(int j=0;j<n;j++){
if(!vis[j] && g[u][j]){
if(len[j]>len[u]+g[u][j]){
ans[j].clear();
ans[j].push_back(u);
len[j]=len[u]+g[u][j];
}
else if(len[j]==len[u]+g[u][j])
ans[j].push_back(u);
}
}
}
}
void dij(){
tim[be]=0;
for(int i=0;i<n;i++){
int u=-1;
int mii=999999;
for(int j=0;j<n;j++){
if(!vis[j] && tim[j]<mii){
u=j;
mii=tim[j];
}
}
if(u==-1) break;
vis[u]=1;
for(int j=0;j<n;j++){
if(!vis[j] && g[u][j]){
if(tim[j]>tim[u]+g1[u][j]){
ans1[j].clear();
ans1[j].push_back(u);
tim[j]=tim[u]+g1[u][j];
}
else if(tim[j]==tim[u]+g1[u][j])
ans1[j].push_back(u);
}
}
}
}
void dfs(int en){
if(en==be){
int sum=0;
if(dis==0){
for(int i=1;i<cur1.size();i++){
sum+=g1[cur1[i]][cur1[i-1]];
dis+=g[cur1[i]][cur1[i-1]];
}
}
else{
for(int i=1;i<cur1.size();i++){
sum+=g1[cur1[i]][cur1[i-1]];
}
}
if(sum<ma){
ma=sum;
ll=cur1;
}
return ;
}
for(auto i:ans[en]){
cur1.push_back(i);
dfs(i);
cur1.pop_back();
}
}
void dfs1(int en){
if(en==be){
if(!ti){
for(int i=1;i<cur2.size();i++){
ti+=g1[cur2[i]][cur2[i-1]];
}
}
if(cur2.size()<ma){
ma=cur2.size();
rr=cur2;
}
return ;
}
for(auto i:ans1[en]){
cur2.push_back(i);
dfs1(i);
cur2.pop_back();
}
}
int main(){
cin>>n>>m;
fill(len,len+505,999999);
fill(tim,tim+505,999999);
fill(vis,vis+505,0);
for(int i=0;i<m;i++){
int v1,v2,f,l,t;
cin>>v1>>v2>>f>>l>>t;
if(f==1){
g[v1][v2]=l;
g1[v1][v2]=t;
}
else{
g[v1][v2]=g[v2][v1]=l;
g1[v1][v2]=g1[v2][v1]=t;
}
}
cin>>be>>en;
cur1.push_back(en);
dij1();
dfs(en);
ma=999999;
cur2.push_back(en);
fill(vis,vis+505,0);
dij();
dfs1(en);
int fla=1;
if(ll.size()==rr.size()){
for(int i=0;i<rr.size();i++){
if(ll[i]!=rr[i]){
fla=0;
break;
}
}
}
else
fla=0;
if(!fla){
printf("Distance = %d: ",dis);
for(int i=ll.size()-1;i>=0;i--){
printf("%d",ll[i]);
if(i!=0)
printf(" -> ");
}
printf("\nTime = %d: ",ti);
for(int i=rr.size()-1;i>=0;i--){
printf("%d",rr[i]);
if(i!=0)
printf(" -> ");
}
}
else{
printf("Distance = %d; Time = %d: ",dis,ti);
for(int i=rr.size()-1;i>=0;i--){
printf("%d",rr[i]);
if(i!=0)
printf(" -> ");
}
}
printf("\n");
return 0;
}