zoukankan      html  css  js  c++  java
  • UVA-11374(最短路)

    题意:

    机场快线有经济线和商业线,现在分别给出经济线和商业线的的路线,现在只能坐一站商业线,其他坐经济线,问从起点到终点的最短用时是多少,还有路线是怎样的;

    思路:

    预处理出起点到所有站的最短距离和终点到所有站的最短距离,枚举要坐的那趟商业线,然后里面最小的就是答案了;

    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <bits/stdc++.h>
    #include <stack>
    
    using namespace std;
    
    #define For(i,j,n) for(int i=j;i<=n;i++)
    #define mst(ss,b) memset(ss,b,sizeof(ss));
    
    typedef  long long LL;
    
    template<class T> void read(T&num) {
        char CH; bool F=false;
        for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
        for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
        F && (num=-num);
    }
    int stk[70], tp;
    template<class T> inline void print(T p) {
        if(!p) { puts("0"); return; }
        while(p) stk[++ tp] = p%10, p/=10;
        while(tp) putchar(stk[tp--] + '0');
        putchar('
    ');
    }
    
    const LL mod=1e9+7;
    const double PI=acos(-1.0);
    const int inf=1e9;
    const int N=2e5+10;
    const int maxn=500+10;
    const double eps=1e-6;
    
    int n,s,e,m;
    int mp[maxn][maxn],dis[2][maxn],vis[maxn],p[2][maxn];
    
    inline void Dijkstra(int from,int flag)
    {
        mst(vis,0);
        vis[from]=1;
        For(i,1,n)dis[flag][i]=mp[from][i],p[flag][i]=from;
        dis[flag][from]=0;
        For(i,2,n)
        {
            int temp=inf,k;
            For(j,1,n)
                if(!vis[j]&&temp>dis[flag][j])k=j,temp=dis[flag][j];
            if(temp==inf)break;
            vis[k]=1;
            For(j,1,n)
            {
                if(!vis[j]&&dis[flag][j]>dis[flag][k]+mp[k][j])
                    dis[flag][j]=dis[flag][k]+mp[k][j],p[flag][j]=k;
            }
        }
    }
    
    int main()
    {       
            int Case=0;
            while(cin>>n>>s>>e)
            {
                if(Case)printf("
    ");
                Case++;
                For(i,1,n)For(j,1,n)mp[i][j]=inf;
                read(m);
                int u,v,w;
                For(i,1,m)
                {
                    read(u);read(v);read(w);
                    mp[u][v]=mp[v][u]=min(mp[u][v],w);
                }
                Dijkstra(s,0);
                Dijkstra(e,1);
                int ans=dis[0][e],uppos=-1,downpos=-1;
                int q;
                read(q);
                For(i,1,q)
                {
                    read(u);read(v);read(w);
                    int temp=dis[0][u]+w+dis[1][v];
                   // cout<<dis[0][u]<<" "<<dis[1][v]<<endl;
                    if(temp<ans)ans=temp,uppos=u,downpos=v;
                    temp=dis[0][v]+w+dis[1][u];
                    if(temp<ans)ans=temp,uppos=v,downpos=u;
                }
                if(uppos==-1)
                {
                    int cur=s;
                    while(cur!=e)printf("%d ",cur),cur=p[1][cur];
                    printf("%d
    Ticket Not Used
    %d
    ",e,ans);
                }
                else 
                {
                    int cur=uppos,cnt=0,tion[maxn];
                    while(cur!=s)
                    {
                        tion[++cnt]=cur;
                        cur=p[0][cur];
                    }
                    tion[++cnt]=s;
                    for(int i=cnt;i>0;i--)printf("%d ",tion[i]);
                    cur=downpos;
                    while(cur!=e)printf("%d ",cur),cur=p[1][cur];
                    printf("%d
    %d
    %d
    ",e,uppos,ans);
                }
                //printf("
    ");
            }
            return 0;
    }
    

      

  • 相关阅读:
    UVA-679車的摆放(DFS)
    全排列问题(递归调用)
    STL栈的应用—UVA673
    nefu 84 五指山(扩展欧几里德)
    POJ 1061 青蛙的约会(扩展欧几里德)
    nefu 116 两仪剑法
    nefu 115 斐波那契的整除
    HDU 2099 整除的尾数
    Codeforces Round #339 (Div. 2) B. Gena's Code
    Codeforces Round #339 (Div. 2) A. Link/Cut Tree
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/5689519.html
Copyright © 2011-2022 走看看