zoukankan      html  css  js  c++  java
  • Uva11374 Airport Express

    最短路问题。

    从起点和终点开始各跑一次dijkstra,可以得到起点、终点到任意点的距离。枚举使用的商业线路,找最优解。

    破题卡输出,记录前驱和输出什么的仿佛比算法本身还麻烦。

    /*by SilverN*/
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<vector>
    #include<queue>
    using namespace std;
    const int mxn=2410;
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,m,k,S,E;
    struct exp{
        int x,y,w;
    }ex[mxn];
    struct edge{
        int v,nxt,dis;
    }e[mxn<<2];
    int hd[mxn],mct=0;
    void add_edge(int u,int v,int d){
        e[++mct].v=v;e[mct].nxt=hd[u];e[mct].dis=d;hd[u]=mct;
        return;
    }
    struct node{
        int v,d;
        bool operator < (const node r) const {return d>r.d;}
    };
    priority_queue<node>tp;
    int pre[mxn],nxt[mxn];
    int dis[mxn];
    int mdis[mxn];
    void Dij1(int st){
        while(!tp.empty())tp.pop();
        memset(dis,0x3f,sizeof dis);
        tp.push((node){st,0});
        dis[st]=0;
        while(!tp.empty()){
            node tmp=tp.top();tp.pop();
            if(tmp.d>dis[tmp.v])continue;
            int u=tmp.v;
            for(int i=hd[u];i;i=e[i].nxt){
                int v=e[i].v;
                if(dis[v]>dis[u]+e[i].dis){
                    dis[v]=dis[u]+e[i].dis;
                    pre[v]=u;
                    tp.push((node){v,dis[v]});
                }
            }
        }
        return;
    }
    void Dij2(int st){
        while(!tp.empty())tp.pop();
        memset(dis,0x3f,sizeof dis);
        tp.push((node){st,0});
        dis[st]=0;
        while(!tp.empty()){
            node tmp=tp.top();tp.pop();
            if(tmp.d>dis[tmp.v])continue;
            int u=tmp.v;
            for(int i=hd[u];i;i=e[i].nxt){
                int v=e[i].v;
                if(dis[v]>dis[u]+e[i].dis){
                    dis[v]=dis[u]+e[i].dis;
                    nxt[v]=u;
                    tp.push((node){v,dis[v]});
                }
            }
        }
        return;    
    }
    int st[mxn],top=0;
    void init(){
        memset(hd,0,sizeof hd);
        memset(pre,0,sizeof pre);
        memset(nxt,0,sizeof nxt);
        mct=0;top=0;
    }
    
    int main(){
        int i,j;
        bool flag=0;
        while(scanf("%d%d%d%d",&n,&S,&E,&m)!=EOF){
            if(flag){
                printf("
    ");
            }
            flag=1;
            init();
            int u,v,w;
            for(i=1;i<=m;i++){
                u=read();v=read();w=read();
                add_edge(u,v,w);
                add_edge(v,u,w);
            }
            k=read();
            for(i=1;i<=k;i++){
                ex[i].x=read();ex[i].y=read();
                ex[i].w=read();
            }
            Dij1(S);
            memcpy(mdis,dis,sizeof dis);
            Dij2(E);
            int pos1=0,pos2=0,ans=1e9;
            for(i=1;i<=n;i++){
                if(ans>mdis[i]+dis[i]){
                    ans=mdis[i]+dis[i];
                    pos1=i;
                }
            }
            for(i=1;i<=k;i++){
                int tmp=mdis[ex[i].x]+dis[ex[i].y]+ex[i].w;
                if(ans>tmp){
                    ans=tmp;pos1=ex[i].x;pos2=ex[i].y;
                }
                tmp=mdis[ex[i].y]+dis[ex[i].x]+ex[i].w;
                if(ans>tmp){
                    ans=tmp;pos1=ex[i].y;pos2=ex[i].x;
                }
            }
            if(pos1 && !pos2){
    //            printf("Test1
    ");
                int tmp=pos1;
                while(pre[pos1]){
                    pos1=pre[pos1];
                    st[++top]=pos1;
                }
                while(top)    printf("%d ",st[top--]);
                pos1=tmp;
                do{
                    printf("%d",pos1);
                    if(nxt[pos1])printf(" ");
                    pos1=nxt[pos1];
                }while(pos1);
                printf("
    Ticket Not Used
    ");
            }
            else{
                if(pos1 && pos2){
                    int tmp=pos1;
                    while(pre[pos1]){
                        pos1=pre[pos1];
                        st[++top]=pos1;
                    }
                    while(top)    printf("%d ",st[top--]);
                    pos1=tmp;
                    printf("%d ",pos1);
    //                pos2=nxt[pos2];
                    while(pos2){
                        printf("%d",pos2);
                        if(nxt[pos2])printf(" ");
                        pos2=nxt[pos2];
                    }
                    printf("
    %d
    ",pos1);
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    2016-2017-2 20155325实验二《Java面向对象程序设计》实验报告
    20155325 2016-2017-2 《Java程序设计》第8周学习总结
    20155325《Java程序设计》实验一(Java开发环境的熟悉)实验报告
    20155323 2016-2017-2《Java程序设计》课程总结
    20155323 第五次实验 网络编程与安全
    20155323课堂实践20170531
    20155323课堂实践20170524
    20155323 第四次实验 Android程序设计实验报告
    20155323课堂实践20170517
    20155323课堂实践20170510
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6089858.html
Copyright © 2011-2022 走看看