BZOJ 1003 dp+最短路

1003: [ZJOI2006]物流运输

题意:m个码头,从码头1到码头m,连续n天都要运送货物。每一天的花费是总路线长度大小,但如果和前一天的路线不一样,要另处加上k元花费。而且有些码头有些天不能用,问这n天的最小费用。

tags:菜鸡一开始真没想到是dp

求n天时最小花费,就要想到以天数为阶段进行规划。dp[i][j]表示第i天到第j天走同一条路线的花费,则f[i]=min( f[i], f[j]+dp[j+1][i]+k )。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define F(i,b,a)  for (int i=b;i>=a;i--)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 200;
const ll inf=1e18;

int n, m, k, e1, d1, q[10000], head[N], tot;
ll c[N][N], dis[N], f[N];
bool vis[N], use[N], flag[N][N];
struct Edge{int to, next; ll w;}e[N*N];
void Addedge(int u, int v, ll w) { e[++tot].to=v, e[tot].w=w, e[tot].next=head[u], head[u]=tot; };
ll spfa(int x, int y)
{
    mes(use, 0);  mes(vis, 0);
    FF(i,1,m) dis[i]=inf;   dis[1]=0;
    FF(i,x,y) FF(j,1,m) if(flag[j][i]) use[j]=1;
    int t=0, h=0;
    q[++t]=1, dis[1]=0;
    while(h!=t) {
        int u=q[++h]; vis[u]=1;
        for(int i=head[u]; i; i=e[i].next) {
            int v=e[i].to;  ll w=e[i].w;
            if(use[v]==0 && dis[v]>dis[u]+w) {
                dis[v]=dis[u]+w;
                if(vis[v]==0) q[++t]=v, vis[v]=1;
            }
        }
        vis[u]=0;
    }
    return dis[m]*(dis[m]>=inf ? 1 : (y-x+1));
}
void Init()
{
    scanf("%d %d %d %d", &n, &m, &k, &e1);
    int u, v, p, a, b;
    ll w;
    FF(i,1,e1) {
        scanf("%d %d %lld", &u, &v, &w);
        Addedge(u, v, w);  Addedge(v, u, w);
    }
    scanf("%d", &d1);
    FF(i,1,d1) {
        scanf("%d %d %d", &p, &a, &b);
        FF(j,a,b) flag[p][j]=1;
    }
    FF(i,1,n) FF(j,1,i) c[j][i]=spfa(j, i);
}
void DP()
{
    FF(i,1,n) {
        f[i]=c[1][i];
        FF(j,1,i-1) f[i]=min(f[i], f[j]+c[j+1][i]+k);
    }
    printf("%lld\n", f[n]);
}
int main()
{
    //freopen("in.txt", "r", stdin);
    Init();
    DP();

    return 0;
}
时间: 2024-10-12 23:51:16

BZOJ 1003 dp+最短路的相关文章

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: [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;

bzoj 1791 DP

首先对于一棵树我们可以tree_dp来解决这个问题,那么对于环上每个点为根的树我们可以求出这个树的一端为根的最长链,并且在tree_dp的过程中更新答案.那么我们对于环,从某个点断开,破环为链,然后再用DP来解决这个问题. 备注:很久之前的一道题,刚转的c++,然后T了,也懒得改了. /************************************************************** Problem: 1791 User: BLADEVIL Language: C++

bzoj 1222 DP

用w[i]表示在A中用了i的时间时在B中最少用多长时间,然后转移就可以了. 备注:这个边界不好定义,所以可以每次用一个cur来存储最优值,然后对w[i]赋值就可以了. /************************************************************** Problem: 1222 User: BLADEVIL Language: C++ Result: Accepted Time:2648 ms Memory:992 kb ***************

bzoj 3622 DP + 容斥

LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[i]大于b的组数. 不妨从整体去考虑,使用$f[n][j]$代表前n个中有j组$a[i]>b[i]$,很容易得到转移式$f[n][j]=f[n-1][j]+f[n-1][j-1]*(cnt[n]-(j-1))$,其中$cnt[i]$为比a[i]小的b[]个数 但是仔细思考该式子含义会发现,$f[n][j

UVA 116 Unidirectional TSP(DP最短路字典序)

Description  Unidirectional TSP  Background Problems that require minimum paths through some domain appear in many different areas of computer science. For example, one of the constraints in VLSI routing problems is minimizing wire length. The Travel

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 最短路+dp

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

bzoj 1003 [ZJOI2006]物流运输(最短路+dp)

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