ZJOI2006物流运输
Posted shxnb666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZJOI2006物流运输相关的知识,希望对你有一定的参考价值。
题面
https://www.luogu.org/problem/P1772
题解
// luogu-judger-enable-o2 #include<cstdio> #include<iostream> #include<cstring> #include<queue> #include<vector> #define LL long long #define ri register int #define N 105 #define INF 100000000000000007LL using namespace std; int n,m,k,e; int d[N][N]; LL f[N]; LL dis[N]; bool vis[N],used[N][N]; LL min(LL a,LL b) if (a<b) return a; else return b; LL dij(int l,int r) bool cant[N]; memset(cant,0,sizeof(cant)); for (ri i=l;i<=r;i++) for (ri j=1;j<=m;j++) if (used[i][j]) cant[j]=1; memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); dis[1]=0;vis[1]=1; for (ri i=1;i<=m;i++) if (!cant[i]) dis[i]=min(dis[i],d[1][i]); for (ri i=2;i<=m;i++) int p=-1; LL mind=INF; for (ri j=1;j<=m;j++) if (!cant[j] && !vis[j] && dis[j]<mind) mind=dis[j],p=j; if (p==-1) break; vis[p]=1; for (ri j=1;j<=m;j++) if (!cant[j] && dis[p]+d[p][j]<dis[j]) dis[j]=dis[p]+d[p][j]; if (dis[m]>INF) return INF; return dis[m]; int main() int yourd,a,b,c; scanf("%d %d %d %d",&n,&m,&k,&e); memset(d,0x3f,sizeof(d)); for (ri i=1;i<=e;i++) scanf("%d %d %d",&a,&b,&c); d[a][b]=d[b][a]=min(d[a][b],c); scanf("%d",&yourd); for (ri i=1;i<=yourd;i++) scanf("%d %d %d",&a,&b,&c); for (ri i=b;i<=c;i++) used[i][a]=1; memset(f,0x3f,sizeof(f)); f[0]=-k; for (ri i=1;i<=n;i++) for (ri j=0;j<i;j++) f[i]=min(f[i],f[j]+(i-j)*dij(j+1,i)+k); cout<<f[n]<<endl; return 0;
以上是关于ZJOI2006物流运输的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ 1003: [ZJOI2006]物流运输trans