BZOJ 1003 物流运输trans(最短路)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1003

思路:m个点e条边n天。给出每条边的权值以及有些点有些天不能走。对于某连续的两天i和i+1,若两天从起点到终点选择的路径不同需要额外代价K。求最小的总代价:ans=sum(每天的代价)+K*改变的次数。每天的代价定义为这一天s到t选择的路径的长度。

思路:令cost[i][j]表示从第i天 到第j天选择一条路径的最短路,f[i]表示前i天的总代价,则f[i]=min(f[j]+cost[j+1][i]*(i-j)+K)。计算 cost[i][j]直接枚举i和j计算最短路。这里有些点可能[i,j]天不能走,而且[p,q]天也不能走。不是说只有一段时间不能走。每次求最短路 时只能利用能走的点进行转移。

vector<pair<int,int> > g[N];
int n,m,K,e,d;
int node[N],L[N],R[N];
int ok[N];

int cal(int x,int y)
{
    queue<int> Q;
    int dis[N],h[N],i,u,v,w;
    clr(ok,0);
    FOR0(i,d)
    {
        u=node[i];
        if(x>R[i]||y<L[i]);
        else ok[u]=1;
    }
    FOR1(i,m) dis[i]=INF;
    clr(h,0); dis[1]=0; Q.push(1);
    while(!Q.empty())
    {
        u=Q.front();
        Q.pop();

        h[u]=0;
        FOR0(i,SZ(g[u]))
        {
            v=g[u][i].first;
            w=g[u][i].second;
            if(!ok[v]&&dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
                if(!h[v]) Q.push(v),h[v]=1;
            }
        }
    }
    return dis[m];
}

int f[N],cost[N][N];

int main()
{
    RD(n,m); RD(K,e); clr(L,-1);
    int i,j,u,v,w;
    FOR0(i,e)
    {
        RD(u,v,w);
        g[u].pb(MP(v,w));
        g[v].pb(MP(u,w));
    }
    RD(d);
    FOR0(i,d) RD(node[i],L[i],R[i]);
    FOR1(i,n) for(j=i;j<=n;j++) cost[i][j]=cal(i,j);
    for(i=1;i<=n;i++)
    {
        f[i]=INF;
        for(j=0;j<i;j++) if(f[j]!=INF&&cost[j+1][i]!=INF)
        {
            if(j==0) w=0;
            else w=K;
            f[i]=min(f[i],f[j]+cost[j+1][i]*(i-j)+w);
        }
    }
    PR(f[n]);
    return 0;
}

BZOJ 1003 物流运输trans(最短路),布布扣,bubuko.com

时间: 2024-10-10 21:42:35

BZOJ 1003 物流运输trans(最短路)的相关文章

BZOJ 1003 物流运输trans dijstra+dp

1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3896  Solved: 1608[Submit][Status][Discuss] Description 物 流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路 线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无法装卸

BZOJ 1003 物流运输trans

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

bzoj 1003: [ZJOI2006]物流运输trans 最短路+dp

题目链接 1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5246  Solved: 2157[Submit][Status][Discuss] Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无

BZOJ 1003 物流运输 (动态规划 SPFA 最短路)

1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5590 Solved: 2293 [Submit][Status][Discuss] Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完. 货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线, 以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个 码头会无法装卸货物.这

BZOJ 1003 物流运输 (dp + dijkstra)

1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8672  Solved: 3678[Submit][Status][Discuss] Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无法装卸货物.这时候就

[BZOJ]1003 物流运输(ZJOI2006)

挖坑,日常划水. 从BZOJ上的AC人数来看这题确实不难,但做这种题的常见思路让小C决定还是mark一下. Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无法装卸货物.这时候就必须修改运输路线,让货物能够按时到达目的地.但是修改路线是一件十分麻烦的事情,会带来额外的成本.因此物流公司希望能够订

BZOJ 1003 物流运输 长歌当哭!

真是很生气啊!这道题简直整整花了我一天的时间.自己怎么这么弱呢? 算了,还是来聊一聊这道题的解题历程吧!一开始打算枚举从起点到终点的每条路径后再去动态规划.的确一开始的版本就是这样的.结果TLE了.之后打算再次版本上再去优化,曾想过把map改成数组,把深搜改成dijkstra,还打算把动态数组改成数组,由于一开始的动态规划是按照每一天推到下一天的,所以也曾把这个改成一个区间去推.但是最终在多次TLE后,我换回了WA.内心无比悲痛.无奈之下,跑去看了别人的题解,我去,这么简单.算了,真的得加把劲,

BZOJ 1003 物流运输

最短路+dp. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define maxd 150 #define maxv 250 #define maxe 50050 #define inf 1000000007 using namespace std; struct edge { long long v,w,nx

bzoj 1003物流运输 区间dp+spfa

基本思路: 一开始确实没什么思路,因为觉得怎么着都会超时,然后看一下数据范围,呵,怎么都不会超时. 思路: 1.看到能改变线路,想到可以用以下区间dp,区间dp的话,先枚举长度,枚举开始位置,然后枚举中间点 dp[i][j]=min(dp[i][j],dp[i][z]+dp[z][j]+k); 2.然后每段时间最短路究竟是多少,然后因为不会超时,所以就二重循环枚举就好了 (ps:这里要说明一下给自己提个醒: spfa就是队列优化的迪杰斯特拉,然后的话vis数组每次出一个就置零一个,如果不置零是错