zoukankan      html  css  js  c++  java
  • UVA11280 Flying to Fredericton(dijkstra)

    这几题dijkstra写的比较顺手啊!

    题意:某人要旅行,他把地图上N个城市按照从近到远给出,他要从1飞到N,但是又因为直接飞费用会很昂贵,故他想通过一个程序在换航班不超过K次的情况下所花费用最小!

    分析:因为题目给出的城市名,不利于我们构图,故,通过map映射将他们标号即可.这题还是一样,将每个点的状态都标识出来,V[u][k]表示飞到u点换了k次航班,然后用dijkstra计算最短路即可.

    注意:这题有重边,故不能用邻接矩阵,要使用邻接表!

    // File Name: 11280.cpp
    // Author: Zlbing
    // Created Time: 2013/4/18 11:31:29
    
    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<cstdlib>
    #include<cstdio>
    #include<set>
    #include<map>
    #include<vector>
    #include<cstring>
    #include<stack>
    #include<cmath>
    #include<queue>
    using namespace std;
    #define CL(x,v); memset(x,v,sizeof(x));
    #define INF 0x3f3f3f3f
    #define LL long long
    #define REP(i,r,n) for(int i=r;i<=n;i++)
    #define RREP(i,n,r) for(int i=n;i>=r;i--)
    
    const int MAXN=105;
    map<string,int> S;
    int n,m;
    struct Edge{
        int u,v,cost;
    };
    vector<Edge> edges;
    vector<int> G[MAXN];
    struct node{
        int u,cost,ti;
        bool operator <(const node& a)const{
            return cost>a.cost;
        }
    };
    int V[MAXN][15];
    int dijkstra(int time)
    {
        priority_queue<node> Q;
        Q.push((node){1,0,0});
        memset(V,-1,sizeof(V));
        V[1][0]=0;
        node t,tt;
        while(!Q.empty())
        {
            t=Q.top();
            Q.pop();
            if(t.u==n)return t.cost;
            int u=t.u;
            int cost=t.cost;
            int ti=t.ti;
            for(int i=0;i<G[u].size();i++)
            {
                Edge e=edges[G[u][i]];
                int v=e.v;
                if(ti+1<=time)
                {
                    if(V[v][ti+1]==-1||V[v][ti+1]>t.cost+e.cost)
                    {
                        tt.u=v;
                        tt.cost=t.cost+e.cost;
                        tt.ti=t.ti+1;
                        V[tt.u][tt.ti]=tt.cost;
                        Q.push(tt);
                    }
                }
            }
        }
        return -1;
    }
    int main()
    {
        int N;
        scanf("%d",&N);
        for(int cas=0;cas<N;cas++)
        {
            if(cas)
            printf("\n");
            printf("Scenario #%d\n",cas+1);
            scanf("%d",&n);
            char ch[30];
            char ch1[30];
            int c;
            S.clear();
            REP(i,1,n)
            {
                scanf("%s",ch);
                S[string(ch)]=i;
            }
            REP(i,1,n)G[i].clear();
            edges.clear();
            scanf("%d",&m);
            REP(i,1,m)
            {
                scanf("%s %s %d",ch,ch1,&c);
        //        printf("---%s---\n",ch);
        //        printf("---%s---\n",ch1);
                int a=S[string(ch)];
            //    printf("---a--%d---\n",a);
                int b=S[string(ch1)];
                edges.push_back((Edge){a,b,c});
                int m=edges.size();
                G[a].push_back(m-1);
            }
            int q;
            scanf("%d",&q);
            while(q--)
            {
                int time;
                scanf("%d",&time);
                int ans=dijkstra(time+1);
                if(ans==-1)
                    printf("No satisfactory flights\n");
                else printf("Total cost of flight(s) is $%d\n",ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    web socket RFC6455 frame 打包、解包
    Cacti 加入多台主机带宽汇聚
    C-链表实现,保存文件,评估-单项选择题系统课程设计---ShinePans
    ios7.1安装提示"无法安装应用程序 由于证书无效"的解决方式二(dropbox被封项目转移到Appharbor上)
    【模板】第二类斯特林数·列
    2018-8-10-win10-uwp-slider-隐藏显示数值
    2018-8-10-win10-uwp-slider-隐藏显示数值
    2019-1-27-WPF-使用-ItemsPanel-修改方向
    2019-1-27-WPF-使用-ItemsPanel-修改方向
    2018-8-10-win10-uwp-x_Bind-无法获得资源
  • 原文地址:https://www.cnblogs.com/arbitrary/p/3028158.html
Copyright © 2011-2022 走看看