• COGS 1944. 背驮式行走


    ★   输入文件:piggyback.in   输出文件:piggyback.out   简单对比
    时间限制:1 s   内存限制:256 MB

    【题目描述】

    Bessie和她妹妹Elsie白天都在牧场的不同区域吃草,晚上再回到谷仓休息。天生聪明的她们,想出了一个最节省体力的办法。

    Bessie从一个区域走到相邻区域需要花费B单位的体力,Elsie走到相邻区域需要花费E单位的体力,但是,如果如果她俩都在同一个区域的话,Bessie可以把Elsie背在背上一起走到相邻的区域,只需要花费P单位的体力,这会比她俩分别从这个区域单独走到该区域要节省体力。如果P非常小的话,最高效的方式就是俩人先走到一个地方集合,然后一个驮着另一个回到谷仓;当然了,如果P太大,自然还是两人分头行动比较合算。不过话说回来,她们俩其实并不喜欢这种毫无风度的背驮式行走,这会让她们尊严扫地。

    给出B,E和P,以及牧场的布局,请计算Bessie和Elsie回到谷仓所需的最小体力和。

    【输入格式】

    第一行有5个正整数:B,E,P,N和M,均不超过40000,其中B,E和P所表示的含义如上所述,N表示牧场中区域的个数,编号依次为1~N(N>=3),M表示区域之间边的个数,Bessie和Elsie最初分别待在1号和2号区域,谷仓位于N号区域;

    接下来有M行,每行有两个空格隔开的整数,表示某两个

    【输出格式】

    输出只有一个整数,表示Bessie和Elsie最终回到谷仓一共需要花费的体力的最小值。

    【样例输入】

    4 4 5 8 8
    1 4
    2 3
    3 4
    4 7
    2 5
    5 6
    6 8
    7 8
    

    【样例输出】

    22

    【提示】

    样例解释:

    Bessie先从1号区域来到4号区域,Elsie则先从2号区域经由3号区域也来到4号区域,然后采用背驮式从4号区域经由7号区域到达8号区域,即谷仓。

    【来源】

    在此键入。

    bfs

    枚举中间点取最小值

    屠龙宝刀点击就送

    #include <cstring>
    #include <cstdio>
    #include <queue>
    #define N 40005
    using namespace std;
    bool vis[N];
    int B,E,P,n,m,cnt,dep[N][3],to[N<<1],head[N],nextt[N<<1];
    inline int min(int a,int b) {return a>b?b:a;}
    void bfs(int s,int type)
    {
        memset(vis,0,sizeof(vis));
        vis[s]=1;
        dep[s][type]=0;
        queue<int>q;
        q.push(s);
        for(int u;!q.empty();)
        {
            u=q.front();
            q.pop();
            for(int i=head[u];i;i=nextt[i])
            {
                int v=to[i];
                if(!vis[v])
                {
                    dep[v][type]=dep[u][type]+1;
                    vis[v]=1;
                    q.push(v); 
                }
            }
        }
    }
    int main(int argc,char *argv[])
    {
        freopen("piggyback.in","r",stdin);
        freopen("piggyback.out","w",stdout);
        scanf("%d%d%d%d%d",&B,&E,&P,&n,&m);
        for(int u,v;m--;)
        {
            scanf("%d%d",&u,&v);
            nextt[++cnt]=head[u];to[cnt]=v;head[u]=cnt;
            nextt[++cnt]=head[v];to[cnt]=u;head[v]=cnt;
        }
        bfs(1,0);
        bfs(2,1);
        bfs(n,2);
        int ans=0x7fffffff;
        for(int i=1;i<=n;++i) ans=min(ans,dep[i][0]*B+dep[i][1]*E+dep[i][2]*P);
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    javascript cookie
    mark几个比较好的配色网站
    Javascrip 淡入淡出思路
    实验报告:统计字符串中子字符串出现的次数
    Javascript计算器
    《node入门》学习
    配置ionic(低版本)
    eclipse环境配置
    关于文档加载的方法
    javascript基础-《web前端最佳实践》
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7683916.html
Copyright © 2020-2023  润新知