【JZOJ 3430】DY引擎
来源:互联网 发布:网络用语钓鱼是啥意思 编辑:程序博客网 时间:2024/05/17 04:12
Description
BOSS送给小唐一辆车。小唐开着这辆车从PKU出发去ZJU上课了。
众所周知,天朝公路的收费站超多的。经过观察地图,小唐发现从PKU出发到ZJU的所有路径只会有N(2<=N<=300)个不同的中转点,其中有M(max(0, N-100) <=M<=N)个点是天朝的收费站。N个中转点标号为1…N,其中1代表PKU,N代表ZJU。中转点之间总共有E(E<=50,000)条双向边连接。
每个点还有一个附加属性,用0/1标记,0代表普通中转点,1代表收费站。当然,天朝的地图上面是不会直接告诉你第i个点是普通中转点还是收费站的。地图上有P(1<=P<=3,000)个提示,用[u, v, t]表示:[u, v]区间的所有中转点中,至少有t个收费站。数据保证由所有标记得到的每个点的属性是唯一的。
车既然是BOSS送的,自然非比寻常了。车子使用了世界上最先进的DaxiaYayamao引擎,简称DY引擎。DY引擎可以让车子从U瞬间转移到V,只要U和V的距离不超过L(1<=L<=1,000,000),并且U和V之间不能有收费站(小唐良民一枚,所以要是经过收费站就会停下来交完钱再走)。
DY引擎果然是好东西,但是可惜引擎最多只能用K(0<=K<=30)次。
Solution
这题要用到差分约束系统
用
对于提示x,y,z,很显然有:
移一下:
别忘了隐藏条件:
跑一遍最短路,得出s数组,每个点是不是即可得知,
剩下的先用Floyd跑出两两点之间的最短关系,
用分层spfa跑一遍即可,
复杂度:
Code
#include<cstdio>#include<cstdlib>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=350,FAIL=2139062140;int read(int &n){ char ch=' ';int q=0,w=1; for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar()); if(ch=='-')w=-1,ch=getchar(); for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n;}int n,m,ans,L,K,m1,m2;int a[N][N];int s[N];int b[N][N],de[N];int d[N*N*100],d1[35][N],dd[N*N*100];bool z[N][N];int min(int a,int b){return a>b?b:a;}int max(int a,int b){return a<b?b:a;}void spfas(int q){ int i=1,j=1; d[1]=q;z[0][q]=1; memset(s,60,sizeof(s)); s[q]=m1; while(i<=j) { q=d[i++]; fo(k,0,n)if(a[q][k]+s[q]<s[k]) { s[k]=a[q][k]+s[q]; if(!z[0][k])z[0][k]=1,d[++j]=k; } z[0][q]=0; } fod(i,n,1)s[i]-=s[i-1];}void spfa(int q){ int i=1,j=1,w; d[1]=q;z[0][q]=1; memset(d1,60,sizeof(d1)); d1[0][q]=0; while(i<=j) { q=d[i];w=dd[i++]; fo(k,1,n) { if(b[q][k]+d1[w][q]<d1[w][k]) { d1[w][k]=b[q][k]+d1[w][q]; if(!z[w][k])z[w][k]=1,d[++j]=k,dd[j]=w; } if(b[q][k]<=L&&w<K&&d1[w][q]<d1[w+1][k]) { d1[w+1][k]=d1[w][q]; if(!z[w+1][k])z[w+1][k]=1,d[++j]=k,dd[j]=w+1; } } z[w][q]=0; }}int main(){ int q,w,e; memset(a,60,sizeof(a));memset(b,60,sizeof(b)); read(n),read(m1),read(m),read(m2),read(L),read(K); fo(i,1,m)read(q),read(w),b[w][q]=b[q][w]=min(b[q][w],read(e)); fo(i,1,n+1)a[i][i-1]=min(a[i][i-1],0),a[i-1][i]=min(a[i-1][i],1); fo(i,1,m2)read(q),read(w),a[w][q-1]=min(a[w][q-1],-read(e)); spfas(n+1); fo(k,1,n) fo(i,1,n)if(i!=k) fo(j,1,n)if(j!=i&&j!=k&&!s[k])b[i][j]=min(b[i][j],b[i][k]+b[k][j]); spfa(1); ans=FAIL; fo(i,0,K)ans=min(ans,d1[i][n]); printf("%d\n",ans); return 0;}
- 【JZOJ 3430】DY引擎
- 【JZOJ 3430】 DY引擎
- 【NOIP2013模拟】DY引擎
- 【NOIP2013模拟】DY引擎
- [JZOJ3430] DY引擎
- 【JZOJ3430】DY引擎
- NOIP2013模拟】DY引擎 题解+代码
- 差分约束系统使用心得及dy引擎分析
- DY同志的简历
- 初遇Worm.Viking.dy
- Hibernate中dynamic-insert和dy...
- 使用powershell Client进行有效dy
- 陈dy学姐教师招聘经验
- 微分dx、dy是无穷小吗?
- C++的类型转换符:static_cast、dy…
- 关于丢番图方程x^2-dy^2=-1
- 风车——ctx.rotate(angle),ctx.translate(dx, dy)
- 股票入门基础知识21:什么是股息收益率(DY)
- [leetcode] 【字符串】58. Length of Last Word
- ajax输出json格式
- IntentFilter与隐式Intent
- 虚函数
- 块匹配算法及其matalb代码
- 【JZOJ 3430】DY引擎
- 适合前端使用的火狐插件-会持续更新
- 编译原理 —— 编译器各阶段工作
- Android 修改系统默认时间为24小时格式
- grub rescue 修复
- WinForm中DataGridView导出为Excel(快速版)
- 虚函数 动物叫声
- 图书管理系统
- 61条面向对象设计的经验原则-《OOD启示录》Arthur J.Riel