P1772 [ZJOI2006] 物流运输

/*
cl[i][1-m] iÎïÆ·ÔÚµÚiÌìÊÇ·ñÔÊÐí·ÃÎÊ
can_vis[]+spfa 
dp[i]=min(dp[i],dp[j]+co[j+1][i]*(i-j)+k)  ::dp 0x3f  ::dp[i]=co[1][i]*i
co[i][j]=dis[m]

:::多组数据 不要用memset
*/

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
//#include<queue>
//#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=2e2+10;

int n,m,k,e,d;
int head[maxn],to[maxn<<1],nxt[maxn<<1],w[maxn<<1],tot;
ll dis[maxn],vis[maxn],co[maxn][maxn],dp[maxn];
int cl[maxn][maxn],cant_vis[maxn];

void add(int a,int b,int val){
    to[++tot]=b,nxt[tot]=head[a],head[a]=tot;w[tot]=val;
}

void spfa()
{
//    memset(dis,0x3f,sizeof(dis));
//    memset(vis,0,sizeof(vis));
    for(int i=1;i<=m;i++) dis[i]=0x3f3f3f3f,vis[i]=0;
    queue<int> q;    q.push(1);dis[1]=0;vis[1]=1;
    while(!q.empty())
    {
        int u=q.front();q.pop();vis[u]=0;
        for(int i=head[u];i;i=nxt[i])
        {
            int v=to[i];    if(cant_vis[v]) continue;
            if(dis[v]>dis[u]+w[i])
            {
                dis[v]=dis[u]+w[i];
                if(vis[v]==0) vis[v]=1,q.push(v);
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m>>k>>e;
    for(int i=1;i<=e;i++){
        int a,b,val;cin>>a>>b>>val;
        add(a,b,val),add(b,a,val);
    }
    cin>>d;
    for(int i=1;i<=d;i++){
        int p,a,b;cin>>p>>a>>b;
        for(int j=a;j<=b;j++)    cl[p][j]=1;
    }
    
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){//
            
            memset(cant_vis,0,sizeof(cant_vis));
            for(int mt=1;mt<=m;mt++)
                for(int tim=i;tim<=j;tim++)//
                    if(cl[mt][tim]==1) cant_vis[mt]=1;
            
            spfa();
            co[i][j]=dis[m];
        }
    }
    memset(dp,0x3f,sizeof(dp));
    for(int i=1;i<=n;i++){
        dp[i]=co[1][i]*i;
        for(int j=0;j<=i-1;j++){
            dp[i]=min(dp[i],dp[j]+co[j+1][i]*(i-j-1+1)+k);
        }
    }
    cout<<dp[n]<<'\n';
    return 0;
}

 

posted @ 2023-09-17 16:02  JMXZ  阅读(9)  评论(0)    收藏  举报