• 【BZOJ 1003】[ZJOI2006]物流运输(Dijkstra+DP)


    题链

    http://www.lydsy.com/JudgeOnline/problem.php?id=1003

    Description

    物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转
    停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种
    因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是
    修改路线是一件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得总成本
    尽可能地小。

    Input

    第一行是四个整数n(1<=n<=100)、m(1<=m<=20)、K和e。n表示货物运输所需天数,m表示码头总数,K表示
    每次修改运输路线所需成本。接下来e行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编
    号以及航线长度(>0)。其中码头A编号为1,码头B编号为m。单位长度的运输费用为1。航线是双向的。再接下来
    一行是一个整数d,后面的d行每行是三个整数P( 1 < P < m)、a、b(1< = a < = b < = n)。表示编号为P的码
    头从第a天到第b天无法装卸货物(含头尾)。同一个码头有可能在多个时间段内不可用。但任何时间都存在至少一
    条从码头A到码头B的运输路线。

    Output

    包括了一个整数表示最小的总成本。总成本=n天运输路线长度之和+K*改变运输路线的次数。

    Sample Input

    5 5 10 8
    1 2 1
    1 3 3
    1 4 2
    2 3 2
    2 4 4
    3 4 1
    3 5 2
    4 5 2
    4
    2 2 3
    3 1 1
    3 3 3
    4 4 5

    Sample Output

    32
    //前三天走1-4-5,后两天走1-3-5,这样总成本为(2+2)3+(3+2)2+10=32

    题解

    a[i][j]为第i天到第j天畅通的最短路径,dp[i]为到第i天的最小成本。
    (dp[i]=min ( dp[i] , dp[j] + k + a[j+1][i]*(i-j) );)
    至于a[i][j],直接使用最短路算法预处理一下即可

    参考代码

    #include<queue>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    #define inf 1000000000
    #define mod 1000000007
    using namespace std;
    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;
    }
    void Out(ll a) {
        if(a<0) putchar('-'),a=-a;
        if(a>=10) Out(a/10);
        putchar(a%10+'0');
    }
    const int N=105;
    struct Edge{
        ll cost;
        int to,nxt;
        Edge(){};
        Edge(ll tc,int tt,int tn=0):cost(tc),to(tt),nxt(tn){}
        bool operator < (const Edge &an) const{
            return cost>an.cost;
        }
    }Path[1005];
    int head[N],cnt;
    ll dis[N],a[N][N],dp[N];
    bool vis[N],flag[N][N];
    void Addedge(int u,int v,int w){
        Path[cnt]=(Edge){w,v,head[u]};
        head[u]=cnt++;
    }
    bool lock[N];
    void Dijkstra(int x,int y,int m)
    {
        priority_queue<Edge>que;
        memset(lock,false,sizeof(lock));
        memset(vis,false,sizeof(vis));
        for(int i=1;i<=m;i++) dis[i]=inf;
        for(int i=x;i<=y;i++)
    	   for(int j=1;j<=m;j++)
    	      if(flag[i][j]) lock[j]=true;
        dis[1]=0;
        que.push(Edge(0LL,1));
        while(!que.empty()){
            int cur=que.top().to;que.pop();
            if(vis[cur])continue;
            vis[cur]=true;
            for(int i=head[cur];i;i=Path[i].nxt)
                if(!lock[Path[i].to]&&dis[cur]+Path[i].cost<dis[Path[i].to]){
                    dis[Path[i].to]=dis[cur]+Path[i].cost;
                    que.push(Edge(dis[Path[i].to],Path[i].to));
                }
        }
        a[x][y]=dis[m];
    }
    void Init(){
        memset(head,0,sizeof(head));
        memset(flag,false,sizeof(flag));
        cnt=1;
    }
    int main()
    {
    	Init();
    	int n=read(),m=read(),k=read(),q=read();
    	for(int i=0;i<q;i++){
        	int u=read(),v=read(),x=read();
        	Addedge(u,v,x);
        	Addedge(v,u,x);
        }
        int d=read();
        for(int i=0;i<d;i++){
        	int id=read(),x=read(),y=read();
        	for(int j=x;j<=y;j++) flag[j][id]=true;
        }
        for(int i=1;i<=n;i++) for(int j=i;j<=n;j++){
                Dijkstra(i,j,m);
        }
        for(int i=1;i<=n;i++){
    	   dp[i]=a[1][i]*i;
    	   for(int j=0;j<i;j++) dp[i]=min(dp[i],dp[j]+k+a[j+1][i]*(i-j));
        }
        Out(dp[n]);
    	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/zsyacm666666/p/7152720.html
Copyright © 2020-2023  润新知