bzoj 1003: [ZJOI2006]物流运输trans

来源:互联网 发布:淘宝客资源怎么找 编辑:程序博客网 时间:2024/04/28 21:16

这道题还算比较水。。

spfa预处理从第i天到第j天的可行最短路存为t[i][j],

然后直接dp。

f[i] 代表到第i天的最小费用

f[i] = min(f[i],min(t[1][i]*i,f[j]+k+t[j+1][i]*(i-j)))

/*ID:zsy99021PROB:bzoj1003 LANG:C++*/#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <iostream>#include <fstream>#include <ctime>#define N 108#define M 28#define mid(l,r) ((l+r) >> 1)#define INF 0x7ffffffusing namespace std;  long long n,t[N][N],m,k,e,head[M];long long f[N]; bool flag[N][M];  struct wulala{    int node,next,dist;}h[M*M];  int spfa(int a,int b){    bool block[M],inq[M];    int dis[M];    int tail = 0,headd = 1,q[M*M];    memset(block,0,sizeof(block));    memset(inq,0,sizeof(inq));    memset(q,0,sizeof(q));    for (int i = 1;i <= m;i++) dis[i] = INF;    for (int i = a;i <= b;i++)        for (int j = 1;j <= m;j++) if (flag[i][j]) block[j] = true;    q[1] = 1; inq[1] = true; dis[1] = 0;    while(tail < headd)    {        int u = q[++tail];        int c = head[u];        while(c)        {            if (block[h[c].node]||dis[h[c].node] < dis[u] + h[c].dist)            {                c = h[c].next;                continue;            }            if (!inq[h[c].node]) q[++headd] = h[c].node;            dis[h[c].node] = dis[u] + h[c].dist;            inq[h[c].node] = true;            c = h[c].next;         }        inq[u] = false;    }    return(dis[m]);}  void init(){    memset(flag,0,sizeof(flag));    scanf("%d%d%d%d",&n,&m,&k,&e);    for (int i = 1;i <= e;i++)    {        int x,y,z;        scanf("%d%d%d",&x,&y,&z);        h[2*i-1].node = y;        h[2*i].node = x;        h[2*i-1].dist = h[2*i].dist = z;        h[2*i-1].next = head[x];        head[x] = 2 * i - 1;        h[2*i].next = head[y];        head[y] = 2 * i;    }    int d;    scanf("%d",&d);    for (int i = 1;i <= d;i++)    {        int a,b,p;        scanf("%d%d%d",&p,&a,&b);        for (int j = a;j <= b;j++) flag[j][p] = true;     }     for (int i = 1;i <= n;i++)        for (int j = i;j <= n;j++)            t[i][j] = spfa(i,j);}  void work(){    memset(f,127,sizeof(f));     for (int i = 1;i <= n;i++) f[0] = 0;    for (int i = 1;i <= n;i++)        for (int j = 0;j < i;j++)            f[i] = min(f[i],min(t[1][i]*i,f[j]+k+t[j+1][i]*(i-j)));}  void debug(){    for (int i = 1;i <= n;i++)    {        for (int j = 1;j <= n;j++) printf("%d ",t[i][j]);        printf("\n");    }}  int main(){    init();//  debug();    work();    printf("%d\n",f[n]);    return 0;}

0 0
原创粉丝点击