bzoj1003 物流运输(dijkstra+dp)

题意:

一共有n天,每天都要把货物从1运到m,代价是路长

然后每个地方都可能有几天不能走

然后你就必须改变路线在那天避开这些地方,这需要代价k

问你n天的最小代价

思路:

一共最多100天,可以n^2暴力时间段,表示这段时间的路径是一样的

然后跑dijkstra,得出最优解

然后用dp更新状态

比如当前是从第l天到第r天,dijkstra结果在d[m]中,则

dp[r]=min(dp[r],dp[l-1]+(r-l+1)*d[m]+k);

dp初值为inf,dp[0]的初值为0,最后dp[n]-k就是答案(dp[0]更新是不用k的)

/* ***********************************************
Author        :devil
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <stdlib.h>
#define inf 0x3f3f3f3f
#define LL long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dec(i,a,b) for(int i=a;i>=b;i--)
#define ou(a) printf("%d\n",a)
#define pb push_back
#define mkp make_pair
template<class T>inline void rd(T &x){char c=getchar();x=0;while(!isdigit(c))c=getchar();while(isdigit(c)){x=x*10+c-‘0‘;c=getchar();}}
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
using namespace std;
const int mod=1e9+7;
const int N=2e3+10;
int n,m,k,e,x,y,t;
int id[N],ax[N],ay[N],dp[105],d[21];
bool vis[21];
vector<pair<int,int> >eg[21];
struct node
{
    int v,d;
    node(int a=0,int b=0):v(a),d(b){}
    bool operator < (const node &a) const
    {
        return d>a.d;
    }
};
void dijkstra(int d1,int d2)
{
    memset(vis,0,sizeof(vis));
    memset(d,inf,sizeof(d));
    d[1]=0;
    rep(i,1,e) if(!(ax[i]>d2||ay[i]<d1)) vis[id[i]]=1;
    priority_queue<node>q;
    q.push(node(1,0));
    node tmp;
    while(!q.empty())
    {
        tmp=q.top();
        q.pop();
        int u=tmp.v;
        if(vis[u]) continue;
        vis[u]=1;
        rep(i,0,eg[u].size()-1)
        {
            int v=eg[u][i].first,w=eg[u][i].second;
            if(!vis[v]&&d[v]>d[u]+w)
            {
                d[v]=d[u]+w;
                q.push(node(v,d[v]));
            }
        }
    }
}
int main()
{
    rd(n),rd(m),rd(k),rd(e);
    while(e--)
    {
        rd(x),rd(y),rd(t);
        eg[x].pb(mkp(y,t));
        eg[y].pb(mkp(x,t));
    }
    rd(e);
    rep(i,1,e) rd(id[i]),rd(ax[i]),rd(ay[i]);
    rep(i,1,n)
    {
        dp[i]=inf;
        rep(j,1,i)
        {
            dijkstra(j,i);
            if(d[m]!=inf) dp[i]=min(dp[i],dp[j-1]+(i-j+1)*d[m]+k);
        }
    }
    ou(dp[n]-k);
    return 0;
}
时间: 2024-12-29 23:25:36

bzoj1003 物流运输(dijkstra+dp)的相关文章

bzoj1003/luogu1772 物流运输 (dijkstra+dp)

先求出某一段时间[i,j]一直用同一个路径的最短路,乘上天数,记作cost[i,j] 那就可以设f[i]是前i天的最小代价,f[i]=f[j]+cost[j+1,i]+K 1 #include<bits/stdc++.h> 2 #define pa pair<int,int> 3 #define ll long long 4 using namespace std; 5 const int maxn=110,maxm=25; 6 7 ll rd(){ 8 ll x=0;char c

[ZJOI2006][BZOJ1003] 物流运输trans

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

bzoj1003 物流运输

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

BZOJ 1003: [ZJOI2006]物流运输trans DP+最短路

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

bzoj1003物流运输

题意:有n天,m个点,每天要从1走到m,一些点有些时段不能到达,保证每天必有一条路能到m,每次更换路线花费k,求最少需要多少花费 此题数据范围很小,随便乱搞. 先跑一个n^2的spfa,求出cost[i][j](第i天到第j天每天的最小花费) 再一个dp就完了: f[i]=min(f[i],f[j]+cost[j+1][i]*(i-j)+k); 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream>

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 物流运输 (dp + dijkstra)

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

spfa最短路+DP BZOJ1003 [ZJOI2006] 物流运输

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

BZOJ1003 ZJOI2006物流运输trans 0&#39;

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