Airport Express

来源:互联网 发布:论文数据分析软件 编辑:程序博客网 时间:2024/05/21 16:58
#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;
        }
    }

return 0;}


一开始想塞入不同的commercial express,用双点最短路径,然后选出最短的,n^4。

然后另外一种办法,先用单源点最短路预处理每个点到起点与终点的距离,对于每条commercial边,匹配端点到起点与终点的最短路,就得得到了使用这条commercial边时的最短路,加入没有使用这些边的情况,从中选出最短路。


这题坑爹的是如何输出




0 0
原创粉丝点击