博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1772 [ZJOI2006]物流运输
阅读量:4982 次
发布时间:2019-06-12

本文共 3832 字,大约阅读时间需要 12 分钟。

//Pro: 1003: [ZJOI2006]物流运输//cost[i][j]表示第i天到第j天的最短路长度//f[i]表示前i天的最小花费 //f[i]=min(f[j-1]+cost[j][i]*(i-j+1)+k) ,j<=i//输出f[n]即为答案 #include
#include
#include
#include
#include
#include
using namespace std;inline int read(){ char c=getchar();int num=0; for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar()) num=num*10+c-'0'; return num;}const int N=105;int n,m,k,e,d;bool flag[N][N],vis[N];int cost[N][N],f[N];int head[N],num_edge;struct Edge{ int v,w,nxt;}edge[N<<3];inline void add_edge(int u,int v,int w){ edge[++num_edge].v=v; edge[num_edge].w=w; edge[num_edge].nxt=head[u]; head[u]=num_edge;}struct STA{ int id,dis; STA(int a=0,int b=0) { id=a,dis=b; } bool operator < (const STA &A) const { return dis>A.dis; }};int dis[N];priority_queue
que;int dijkstra(){ memset(dis,0x3f,sizeof(dis)); dis[1]=0,que.push(STA(1,0)); int now; while(!que.empty()) { now=que.top().id,que.pop(); if(vis[now]) continue; for(int i=head[now],v;i;i=edge[i].nxt) { v=edge[i].v; if(vis[v]) continue; if(dis[v]>dis[now]+edge[i].w) { dis[v]=dis[now]+edge[i].w; que.push(STA(v,dis[v])); } } } return dis[m];}int main(){ n=read(),m=read(),k=read(),e=read(); for(int i=1,a,b,c;i<=e;++i) { a=read(),b=read(),c=read(); add_edge(a,b,c); add_edge(b,a,c); } d=read(); for(int i=1,x,a,b;i<=d;++i) { x=read(),a=read(),b=read(); for(int j=a;j<=b;++j) flag[x][j]=1; } memset(cost,0x3f,sizeof(cost)); for(int i=1;i<=n;++i) { for(int j=i;j<=n;++j) { memset(vis,0,sizeof(vis)); for(int k=1;k<=m;++k) { for(int l=i;l<=j&&vis[k]==0;++l) vis[k]|=flag[k][l]; } cost[i][j]=dijkstra(); } } memset(f,0x3f,sizeof(f)); f[0]=-k; for(int i=1;i<=n;++i) { for(int j=1;j<=i;++j) { if(cost[j][i]==dis[0]) continue; if(f[i]>f[j-1]+cost[j][i]*(i-j+1)+k) f[i]=f[j-1]+cost[j][i]*(i-j+1)+k; } } printf("%d",f[n]); return 0;}
//Pro: 1003: [ZJOI2006]物流运输//cost[i][j]表示第i天到第j天的最短路长度//f[i]表示前i天的最小花费 //f[i]=min(f[j-1]+cost[j][i]*(i-j+1)+k) ,j<=i//输出f[n]即为答案 #include
#include
#include
#include
#include
#include
using namespace std;inline int read(){ char c=getchar();int num=0; for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar()) num=num*10+c-'0'; return num;}const int N=105;int n,m,k,e,d;bool flag[N][N],vis[N];int cost[N][N],f[N];int head[N],num_edge;struct Edge{ int v,w,nxt;}edge[N<<3];inline void add_edge(int u,int v,int w){ edge[++num_edge].v=v; edge[num_edge].w=w; edge[num_edge].nxt=head[u]; head[u]=num_edge;}struct STA{ int id,dis; STA(int a=0,int b=0) { id=a,dis=b; } bool operator < (const STA &A) const { return dis>A.dis; }};int dis[N];priority_queue
que;int dijkstra(){ memset(dis,0x3f,sizeof(dis)); dis[1]=0,que.push(STA(1,0)); int now; while(!que.empty()) { now=que.top().id,que.pop(); if(vis[now]) continue; for(int i=head[now],v;i;i=edge[i].nxt) { v=edge[i].v; if(vis[v]) continue; if(dis[v]>dis[now]+edge[i].w) { dis[v]=dis[now]+edge[i].w; que.push(STA(v,dis[v])); } } } return dis[m];}int main(){ n=read(),m=read(),k=read(),e=read(); for(int i=1,a,b,c;i<=e;++i) { a=read(),b=read(),c=read(); add_edge(a,b,c); add_edge(b,a,c); } d=read(); for(int i=1,x,a,b;i<=d;++i) { x=read(),a=read(),b=read(); for(int j=a;j<=b;++j) flag[x][j]=1; } memset(cost,0x3f,sizeof(cost)); for(int i=1;i<=n;++i) { for(int j=i;j<=n;++j) { memset(vis,0,sizeof(vis)); for(int k=1;k<=m;++k) { for(int l=i;l<=j&&vis[k]==0;++l) vis[k]|=flag[k][l]; } cost[i][j]=dijkstra(); } } memset(f,0x3f,sizeof(f)); f[0]=-k; for(int i=1;i<=n;++i) { for(int j=1;j<=i;++j) { if(cost[j][i]==dis[0]) continue; if(f[i]>f[j-1]+cost[j][i]*(i-j+1)+k) f[i]=f[j-1]+cost[j][i]*(i-j+1)+k; } } printf("%d",f[n]); return 0;}

 

转载于:https://www.cnblogs.com/lovewhy/p/9633657.html

你可能感兴趣的文章
Android RecyclerView notifyDataSetChanged不起作用
查看>>
AndroidStudio3.0 Canary 8注解报错Annotation processors must be explicitly declared now.
查看>>
Android 一个改进的okHttp封装库
查看>>
genymotion下载出现Unable to create virtual device,Server returned HTTP status code 0.
查看>>
Android 下拉刷新框架实现
查看>>
ViewPager + Fragment实现滑动标签页
查看>>
Spring与Hibernate实现增删改查两方法
查看>>
Genymotion 插件在 Eclipse 和 Android Studio 中点击后无法初始化 Initialize Engine: failed 解决方法...
查看>>
1R安装环境
查看>>
初学Python——Socket网络编程
查看>>
Linux 如何实现 VLAN - 每天5分钟玩转 OpenStack(12)
查看>>
Gym - 101252H
查看>>
2019年2月15日,复习
查看>>
线性布局Row和Column
查看>>
关键路径(代码讲解)- 数据结构和算法68
查看>>
if语句三种格式
查看>>
CentOS 7 单用户模式修改root密码
查看>>
Linux DHCP原理
查看>>
Thread.currentThread()和this的区别——《Java多线程编程核心技术》
查看>>
mysql 5.1 Data 文件夹路径
查看>>