• P3110 [USACO14DEC]驮运Piggy Back


    传送门

    做过次短路后,再来做这题感觉轻松不少。

    这题看着就像最短路模板题。

    思路:

      虽说题目看起来比较水,但是码起来还是有点难度的。(对我这个蒟蒻来说)

      这道题,跟"路障"一题差不多,都属于最短路中的分段求值。(即枚举两个最短路,及中间连接部分)

      那么就有思路了:

      ①求出点 1,点 2,点 n 到其他所有点的单源最短路径。(我用的是三次Dijkstra,打上瘾了

      ②即最关键的是枚举每一个点(即两只牛相遇的点),计算相遇前,两只牛各自走过的路径耗费的能量,然后令两只牛相遇后强行连在一起,算出从相遇的点到仓库 n 所需的能量值,再将能量值求和 。每个点都如此枚举一遍,求最小的能量值和即为答案。

    下为求解的关键代码:

        for(int i=1; i<=n; i++)
            ans=min(ans,d1[i]*B+d2[i]*E+d3[i]*P);

    完整代码:

    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<deque>
    #include<set>
    #include<map>
    #include<vector>
    #include<fstream>
    using namespace std;
    #define maxn 400005
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q1;
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q2;
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q3;
    int head[maxn],d1[maxn],d2[maxn],d3[maxn],vis[maxn],cnt=0,B,E,P,n,m,ans;
    struct hh
    {
        int nex,to;
    }t[maxn];
    struct edge
    {
        int x,y;
    }dd[maxn];
    inline int read()
    {
        char kr=0;
        char ls;
        for(;ls>'9'||ls<'0';kr=ls,ls=getchar());
        int xs=0;
        for(;ls>='0'&&ls<='9';ls=getchar())
        {
            xs=xs*10+ls-48;
        }
        if(kr=='-') xs=0-xs;
        return xs;
    }
    inline void add(int nex,int to)
    {
        t[++cnt].nex=head[nex];
        t[cnt].to=to;
        head[nex]=cnt;
    }
    inline void dijkstra_first(int ww)
    {
        memset(d1,0x3f3f3f3f,sizeof(d1));
        memset(vis,0,sizeof(vis));
        q1.push(make_pair(0,ww));
        d1[ww]=0;
        while(!q1.empty())
        {
            int u=q1.top().second;
            q1.pop();
            if(vis[u]) continue;
            vis[u]=1;
            for(int v=head[u];v;v=t[v].nex)
            {
                if(d1[t[v].to]>d1[u]+1&&!vis[t[v].to])
                {
                    d1[t[v].to]=d1[u]+1;
                    q1.push(make_pair(d1[t[v].to],t[v].to));
                }
            }
        }    
    }
    inline void dijkstra_second(int ww)
    {
        memset(d2,0x3f3f3f3f,sizeof(d2));
        memset(vis,0,sizeof(vis));
        q2.push(make_pair(0,ww));
        d2[ww]=0;
        while(!q2.empty())
        {
            int u=q2.top().second;
            q2.pop();
            if(vis[u]) continue;
            vis[u]=1;
            for(int v=head[u];v;v=t[v].nex)
            {
                if(d2[t[v].to]>d2[u]+1&&!vis[t[v].to])
                {
                    d2[t[v].to]=d2[u]+1;
                    q2.push(make_pair(d2[t[v].to],t[v].to));
                }
            }
        }    
    }
    inline void dijkstra_third(int ww)
    {
        memset(d3,0x3f3f3f3f,sizeof(d3));
        memset(vis,0,sizeof(vis));
        q3.push(make_pair(0,ww));
        d3[ww]=0;
        while(!q3.empty())
        {
            int u=q3.top().second;
            q3.pop();
            if(vis[u]) continue;
            vis[u]=1;
            for(int v=head[u];v;v=t[v].nex)
            {
                if(d3[t[v].to]>d3[u]+1&&!vis[t[v].to])
                {
                    d3[t[v].to]=d3[u]+1;
                    q3.push(make_pair(d3[t[v].to],t[v].to));
                }
            }
        }    
    }//三次最短路模板 
    int main()
    {
        B=read();E=read();P=read();n=read();m=read();
        for(int i=1;i<=m;i++)
        {
            dd[i].x=read();dd[i].y=read();
            add(dd[i].x,dd[i].y);
            add(dd[i].y,dd[i].x);//建无向图 
        }
        dijkstra_first(1);
        dijkstra_second(2);
        dijkstra_third(n);
        //cout<<d1[n]<<" "<<d2[n]<<" "<<d3[1]<<" "<<d3[2]<<endl;
        ans=9999999;
        for(int i=1; i<=n; i++)
            ans=min(ans,d1[i]*B+d2[i]*E+d3[i]*P);//枚举每一个点,求出能量和,取小 
        cout<<ans<<endl;//输出 
    return 0;
    }
  • 相关阅读:
    SSM整合——实现书籍的增删改查
    [web]获取用户当前所在城市
    [mysql]pymysql插入500万数据
    [Flask] 01 ORM方法列表
    [少儿编程] 03-龟兔赛跑(下)
    [少儿编程] 02-龟兔赛跑(上)
    [少儿编程] 00-入门课程大纲
    [少儿编程] 01-少儿编程环境搭建
    [Linux] Centos7 部署django项目
    [Linux] centos7 安装Mariadb
  • 原文地址:https://www.cnblogs.com/lck-lck/p/9623385.html
Copyright © 2020-2023  润新知