码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj 1003: [ZJOI2006]物流运输

时间:2018-12-18 22:44:02      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:情况   cost   pop   set   code   cstring   define   ret   efi   

/**************************************************************
    Problem: 1003
    User: lxy8584099
    Language: C++
    Result: Accepted
    Time:60 ms
    Memory:1124 kb
****************************************************************/
 
/*
    数据范围过小
    预处理cost i~j 表示第i天到第j天 都能走的最短路 
    没有的话应该是inf 
    n^2 dp 枚举最近的一次换路 计算相应贡献值去最小 
    注意可能从第0天转移过来 所以 dp[0]=-k 可以抵消
*/
#include<queue>
#include<cstdio> 
#include<cstring>
#include<utility>
#define inf (0x3fffffff)
#define min(a,b) ((a>b)?(b):(a))
using namespace std;
const int N=105,M=105;
struct pp {int v,nxt,d;} e[(N*N)<<1]; 
int head[N],cost[N][N],p[N],a[N],b[N];
int n,m,k,road,T,tot;
int dp[N],dis[N];
bool vis[N];
priority_queue < pair < int,int > > q; 
void add(int u,int v,int d)
{
    e[++tot].nxt=head[u];head[u]=tot;
    e[tot].v=v;e[tot].d=d;
}
void dijk(int L,int R)
{
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;q.push(make_pair(0,1));
    for(int i=1;i<=T;i++)
        if(L>b[i]||R<a[i]);
        else vis[p[i]]=1;
    while(!q.empty())
    {
        int u=q.top().second; q.pop();
        if(vis[u]) continue; vis[u]=1;
        for(int j=head[u];j;j=e[j].nxt)
        {
            int v=e[j].v,d=e[j].d;
            if(dis[v]>dis[u]+d)
            {
                dis[v]=dis[u]+d;
                q.push(make_pair(-dis[v],v));
            }
        }
    }
    cost[L][R]=dis[m];   //一共是m个 码头,,用n 用惯了, 
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&k,&road);
    for(int i=1,u,v,d;i<=road;i++)
    {
        scanf("%d%d%d",&u,&v,&d);
        add(u,v,d);add(v,u,d);
    }
    scanf("%d",&T);
    for(int i=1;i<=T;i++)
    {
        scanf("%d%d%d",&p[i],&a[i],&b[i]);
    }
    for(int i=1;i<=n;i++)
    for(int j=i;j<=n;j++) dijk(i,j);
    memset(dp,0x3f,sizeof(dp));
    dp[0]=-k; // dp 0 的情况 
    for(int i=1;i<=n;i++)
    for(int j=0;j<i;j++) 
        if(cost[j+1][i]!=1061109567&&dp[j]!=1061109567)
            dp[i]=min(dp[i],dp[j]+cost[j+1][i]*(i-j)+k);
    printf("%d\n",dp[n]);
    return 0;
}

 

bzoj 1003: [ZJOI2006]物流运输

标签:情况   cost   pop   set   code   cstring   define   ret   efi   

原文地址:https://www.cnblogs.com/lxy8584099/p/10140278.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!