[2017纪中10-27]图 分治+DP
来源:互联网 发布:网络监控摄像头序列号 编辑:程序博客网 时间:2024/05/21 16:33
题面
首先发现总左往右考虑l到r的边,从u走到v的最小代价,相当于从右往左考虑r到l的边,从v走到u的最小代价。
于是支持从某条边向两边拓展,考虑离线分治。
假设当前在处理分治区间[L,R],设 mid=(L+R)/2,询问区间跨过了 mid 的询问就可以求解,用 DP 得到 lef[i][x][y]表示从 x 出发,处理了从 i 到 mid 的边之后到达 y 的最小代价,以及 rig[i][x][y]表示从 x 出发,处理了从 mid+1 到 i 的边之后到达 y 的最小代价,那么查询的时候只要枚举一下中间经过的那个点就好了。
注意lef是从右往左考虑的,lef[i][x][y]应该转移y到x最小代价。
时间复杂度 O(qn+q log m +m log m *n^2)。
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define ll long long#define chkmin(a,b) a=min(a,b)using namespace std;const int maxm=20010;const int maxq=200010;int n,m,numq;ll lef[maxm][35][35],rig[maxm][35][35],sr[maxm];struct node1{ int x,y,c,r;}e[maxm];struct node2{ int s,t,l,r,id; ll ans;}q[maxq],nq[maxq];bool cmp(node2 a,node2 b){ return a.id<b.id;}int read(){ int x=0; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();} return x;}void solve(int L,int R,int lx,int rx){ if(lx>rx||L>R) return ; int mid=(L+R)>>1,d0,d1,tot=lx-1; for(int i=lx;i<=rx;i++)if(q[i].l<=mid+1&&q[i].r>=mid) nq[++tot]=q[i]; d0=tot; for(int i=lx;i<=rx;i++)if(q[i].r<mid) nq[++tot]=q[i]; d1=tot; for(int i=lx;i<=rx;i++)if(q[i].l>mid+1) nq[++tot]=q[i]; for(int i=lx;i<=rx;i++) q[i]=nq[i]; memset(lef[mid+1],0x3f,sizeof(lef[mid+1])); for(int i=1;i<=n;i++) lef[mid+1][i][i]=0; for(int t=mid;t>=L;t--) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) lef[t][i][j]=lef[t+1][i][j]+e[t].r; for(int i=1;i<=n;i++) { chkmin(lef[t][e[t].x][i],lef[t+1][e[t].y][i]+e[t].c); chkmin(lef[t][e[t].y][i],lef[t+1][e[t].x][i]+e[t].c); } } memset(rig[mid],0x3f,sizeof(rig[mid])); for(int i=1;i<=n;i++) rig[mid][i][i]=0; for(int t=mid+1;t<=R;t++) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) rig[t][i][j]=rig[t-1][i][j]+e[t].r; for(int i=1;i<=n;i++) { chkmin(rig[t][i][e[t].x],rig[t-1][i][e[t].y]+e[t].c); chkmin(rig[t][i][e[t].y],rig[t-1][i][e[t].x]+e[t].c); } } for(int i=lx;i<=d0;i++) for(int j=1;j<=n;j++) chkmin(q[i].ans,lef[q[i].l][q[i].s][j]+rig[q[i].r][j][q[i].t]); solve(L,mid,d0+1,d1); solve(mid+1,R,d1+1,rx); }int main(){ n=read();m=read();numq=read(); for(int i=1;i<=m;i++) e[i].x=read(),e[i].y=read(),e[i].c=read(),e[i].r=read(); for(int i=1;i<=numq;i++) q[i].s=read(),q[i].t=read(),q[i].l=read(),q[i].r=read(),q[i].id=i,q[i].ans=1e10; solve(1,m,1,numq); sort(q+1,q+numq+1,cmp); for(int i=1;i<=numq;i++) if(q[i].ans>2e9) puts("-1"); else printf("%lld\n",q[i].ans); return 0;}
阅读全文
0 0
- [2017纪中10-27]图 分治+DP
- 分治&DP
- DP 分治 最大字段
- CDQ分治优化DP
- [2017纪中10-27]排列 DP+容斥原理
- [2017纪中10-21]Dark DP
- [2017纪中10-22]友谊 DP
- [POJ 1741] DP + Tree 分治
- hdu4616 树形dp,分治思想
- 【HDU4960】区间dp 分治法~
- poj 8464 股票买卖(dp/分治)
- POJ-1741 Tree(dp+分治)
- POJ1741Tree(树形dp/树分治)
- [BZOJ4576]262144 分治/区间DP
- noip2003 加分二叉树 (树形dp+分治法,已知中序,输出前序)
- [2017纪中10-24]合影 树型DP+组合数学
- [2017纪中10-30]Group DP+差分优化
- [BZOJ3672][NOI2014]购票-点分治-CDQ分治-斜率优化DP
- UVa10806
- 预告:消费类无人机图传系统设计中的一些关键 | 硬创公开课
- 百度地图撕逼高德地图,谁是手机地图行业第一?
- 【报名火热进行中】2016“ROBO”世界大学生医疗机器人创意大赛【中国赛区】
- 魅族再遭高通起诉,专利墙背后的“钉子户”还能坚持多久?
- [2017纪中10-27]图 分治+DP
- 线下展势能作用 金立2017 年增速有望高于17%
- kk <script>alert(2222);</script>
- Java嵌套循环中容易出现的问题
- “一元购”内幕揭秘,魔鬼还是天使?
- Verizon:雅虎数据被盗影响重大,可能撤回收购
- 周鸿祎:安全是360业务的基础
- iPhone 7需求旺盛推动台积电打破营收记录
- 360周鸿祎谈电信诈骗:网络安全面前没有旁观者