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,nxt;
}e[maxe];
long long d,n,k,m,qq,g[maxv],nume=0,dis[maxv],dp[maxv],x,y,z,t[maxd][maxd];
bool lim[maxd][maxv],vis[maxv],block[maxv];
queue <long long> q;
void addedge(long long u,long long v,long long w)
{
    e[++nume].v=v;
    e[nume].w=w;
    e[nume].nxt=g[u];
    g[u]=nume;
}
void reset(long long x,long long y)
{
    memset(block,true,sizeof(block));
    fill(dis+1,dis+n+1,inf);
    memset(vis,false,sizeof(vis));
    while (!q.empty()) q.pop();
    for (long long i=x;i<=y;i++)
        for (long long j=1;j<=n;j++)
        {
            if (!lim[i][j])
                block[j]=false;
        }
}
long long spfa(long long x,long long y)
{
    reset(x,y);
    q.push(1);dis[1]=0;vis[1]=true;
    while (!q.empty())
    {
        long long head=q.front();q.pop();
        for (long long i=g[head];i;i=e[i].nxt)
        {
            long long v=e[i].v;
            if ((block[v]) && (dis[v]>dis[head]+e[i].w))
            {
                dis[v]=dis[head]+e[i].w;
                if (!vis[v])
                {
                    vis[v]=true;
                    q.push(v);
                }
            }
        }
        vis[head]=false;
    }
    return dis[n];
}
void dpp()
{
    for (long long i=1;i<=d;i++)
    {
        dp[i]=t[1][i]*i;
        for (long long j=0;j<i;j++)
            dp[i]=min(dp[i],dp[j]+k+(i-j)*t[j+1][i]);
    }
}
int main()
{
    memset(g,0,sizeof(g));
    memset(lim,true,sizeof(lim));
    scanf("%lld%lld%lld%lld",&d,&n,&k,&m);
    for (long long i=1;i<=m;i++)
    {
        scanf("%lld%lld%lld",&x,&y,&z);
        addedge(x,y,z);
        addedge(y,x,z);
    }
    scanf("%lld",&qq);
    for (long long i=1;i<=qq;i++)
    {
        scanf("%lld%lld%lld",&x,&y,&z);
        for (long long j=y;j<=z;j++)
            lim[j][x]=false;
    }
    for (long long i=1;i<=d;i++)
        for (long long j=i;j<=d;j++)
            t[i][j]=spfa(i,j);
    dpp();
    printf("%lld\n",dp[d]);
    return 0;
}
时间: 2024-10-17 10:37:31

BZOJ 1003 物流运输的相关文章

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]+c

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 物流运输 (动态规划 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 物流运输trans

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

BZOJ 1003 物流运输 长歌当哭!

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

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数组每次出一个就置零一个,如果不置零是错

BZOJ 1003: [ZJOI2006]物流运输trans

二次联通门 : BZOJ 1003: [ZJOI2006]物流运输trans /* BZOJ 1003: [ZJOI2006]物流运输trans Spfa + Dp Spfa预处理出i到j天的最小花费 然后N^2 dp即可 */ #include <cstdio> #include <iostream> #include <cstring> #include <queue> #define INF 1e6 const int BUF = 12312313;