#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#define min2(a,b) a<b?a:b
using namespace std;
const int dmax=10100;
const int lmax=100100;
const int INF=9999999;
struct Edge{
int u,v,t;
}e[lmax];
int v[lmax];
int next1[lmax];
int head[dmax];
int d[lmax];
int dist1[dmax];
int dist2[dmax];
int fa1[dmax]={0};
int fa2[dmax]={0};
int vis[dmax]={0};
int print_fa1(int x){
if(!fa1[x])return 1;
if(print_fa1(fa1[x]))
cout<<fa1[x];
else
cout<<" "<<fa1[x];
return 0;
}
void print_fa2(int x){if(!fa2[x])return;cout<<" "<<fa2[x];print_fa2(fa2[x]);}
bool cmp1(int x,int y){return dist1[x]<dist1[y];}
bool cmp2(int x,int y){return dist2[x]<dist2[y];}
int main(){
int N,S,E,T=0;
while(scanf("%d%d%d",&N,&S,&E)!=EOF){
int M;
cin>>M;
int cnt=0;
memset(head,-1,sizeof(head));
for(int i=0;i<M;i++){
int x,y,dd;
cin>>x>>y>>dd;
v[cnt]=y;d[cnt]=dd;next1[cnt]=head[x];head[x]=cnt++;
v[cnt]=x;d[cnt]=dd;next1[cnt]=head[y];head[y]=cnt++;
}
int K;
cin>>K;
for(int i=0;i<K;i++)cin>>e[i].u>>e[i].v>>e[i].t;
memset(fa1,0,sizeof(fa1));
memset(fa2,0,sizeof(fa2));
int a[dmax];
for(int i=0;i<=N;i++){dist1[i]=INF;a[i]=i;}
dist1[S]=0;
int k=0;
while(k<=N){
sort(a+1,a+1+N,cmp1);
int i=a[1];
a[1]=0;
for(int p=head[i];p>=0;p=next1[p]){
if(dist1[v[p]]>dist1[i]+d[p]){
dist1[v[p]]=dist1[i]+d[p];
fa1[v[p]]=i;
}
}
k++;
}
for(int i=0;i<=N;i++){dist2[i]=INF;a[i]=i;}
dist2[E]=0;
k=0;
while(k<=N){
sort(a+1,a+1+N,cmp2);
int i=a[1];
a[1]=0;
for(int p=head[i];p>=0;p=next1[p]){
if(dist2[v[p]]>dist2[i]+d[p]){
dist2[v[p]]=dist2[i]+d[p];
fa2[v[p]]=i;
}
}
k++;
}
int m=INF;
int x,y;
for(int i=0;i<K;i++){
int temp=dist1[e[i].u]+e[i].t+dist2[e[i].v];
if(m>temp){m=temp;x=e[i].u;y=e[i].v;}
temp=dist2[e[i].u]+e[i].t+dist1[e[i].v];
if(m>temp){m=temp;x=e[i].v;y=e[i].u;}
}
if(T++)cout<<endl;
if(dist2[S]<m){
cout<<S;
print_fa2(S);
cout<<endl;
cout<<"Ticket Not Used"<<endl;
cout<<dist2[S]<<endl;
}
else{
print_fa1(x);
if(fa1[x])
cout<<" "<<x;
else
cout<<x;
cout<<" "<<y;
print_fa2(y);
cout<<endl;
cout<<x<<endl;
cout<<m<<endl;
}
}
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#define min2(a,b) a<b?a:b
using namespace std;
const int dmax=10100;
const int lmax=100100;
const int INF=9999999;
struct Edge{
int u,v,t;
}e[lmax];
int v[lmax];
int next1[lmax];
int head[dmax];
int d[lmax];
int dist1[dmax];
int dist2[dmax];
int fa1[dmax]={0};
int fa2[dmax]={0};
int vis[dmax]={0};
int print_fa1(int x){
if(!fa1[x])return 1;
if(print_fa1(fa1[x]))
cout<<fa1[x];
else
cout<<" "<<fa1[x];
return 0;
}
void print_fa2(int x){if(!fa2[x])return;cout<<" "<<fa2[x];print_fa2(fa2[x]);}
bool cmp1(int x,int y){return dist1[x]<dist1[y];}
bool cmp2(int x,int y){return dist2[x]<dist2[y];}
int main(){
int N,S,E,T=0;
while(scanf("%d%d%d",&N,&S,&E)!=EOF){
int M;
cin>>M;
int cnt=0;
memset(head,-1,sizeof(head));
for(int i=0;i<M;i++){
int x,y,dd;
cin>>x>>y>>dd;
v[cnt]=y;d[cnt]=dd;next1[cnt]=head[x];head[x]=cnt++;
v[cnt]=x;d[cnt]=dd;next1[cnt]=head[y];head[y]=cnt++;
}
int K;
cin>>K;
for(int i=0;i<K;i++)cin>>e[i].u>>e[i].v>>e[i].t;
memset(fa1,0,sizeof(fa1));
memset(fa2,0,sizeof(fa2));
int a[dmax];
for(int i=0;i<=N;i++){dist1[i]=INF;a[i]=i;}
dist1[S]=0;
int k=0;
while(k<=N){
sort(a+1,a+1+N,cmp1);
int i=a[1];
a[1]=0;
for(int p=head[i];p>=0;p=next1[p]){
if(dist1[v[p]]>dist1[i]+d[p]){
dist1[v[p]]=dist1[i]+d[p];
fa1[v[p]]=i;
}
}
k++;
}
for(int i=0;i<=N;i++){dist2[i]=INF;a[i]=i;}
dist2[E]=0;
k=0;
while(k<=N){
sort(a+1,a+1+N,cmp2);
int i=a[1];
a[1]=0;
for(int p=head[i];p>=0;p=next1[p]){
if(dist2[v[p]]>dist2[i]+d[p]){
dist2[v[p]]=dist2[i]+d[p];
fa2[v[p]]=i;
}
}
k++;
}
int m=INF;
int x,y;
for(int i=0;i<K;i++){
int temp=dist1[e[i].u]+e[i].t+dist2[e[i].v];
if(m>temp){m=temp;x=e[i].u;y=e[i].v;}
temp=dist2[e[i].u]+e[i].t+dist1[e[i].v];
if(m>temp){m=temp;x=e[i].v;y=e[i].u;}
}
if(T++)cout<<endl;
if(dist2[S]<m){
cout<<S;
print_fa2(S);
cout<<endl;
cout<<"Ticket Not Used"<<endl;
cout<<dist2[S]<<endl;
}
else{
print_fa1(x);
if(fa1[x])
cout<<" "<<x;
else
cout<<x;
cout<<" "<<y;
print_fa2(y);
cout<<endl;
cout<<x<<endl;
cout<<m<<endl;
}
}
return 0;}
一开始想塞入不同的commercial express,用双点最短路径,然后选出最短的,n^4。
然后另外一种办法,先用单源点最短路预处理每个点到起点与终点的距离,对于每条commercial边,匹配端点到起点与终点的最短路,就得得到了使用这条commercial边时的最短路,加入没有使用这些边的情况,从中选出最短路。
这题坑爹的是如何输出