BZOJ4398: 福慧双修【二进制分组+最短路】
4398: 福慧双修
我们考虑分组,对于连1的边,一半强制为出边,一半强制为入边,跑DIJ,然后交换,再做一遍。
然后继续分治下去,这样会发现我们所以状态都能做到,复杂度为O(nlog2n)O(n log^2n)O(nlog2n)
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN=40005,MAXE=200005;
int n,m,Len,Ans=2e9,Dst[MAXN];bool b[MAXE],vis[MAXN];
struct Edge{int tot,lnk[MAXN],son[MAXE],nxt[MAXE],W[MAXE];void Clear(){memset(lnk,0,sizeof(lnk));tot=0;}void Add(int x,int y,int w){son[++tot]=y;W[tot]=w;nxt[tot]=lnk[x];lnk[x]=tot;}
}E;
struct xcw{int x,y,s,t;}a[MAXE];
#include<cctype>
struct HEAP{int x,p;bool operator <(const HEAP b)const{return x>b.x;}
};
priority_queue<HEAP> Heap;
int read(){int ret=0;char ch=getchar();bool f=1;for(;!isdigit(ch);ch=getchar()) f^=!(ch^'-');for(; isdigit(ch);ch=getchar()) ret=ret*10+ch-48;return f?ret:-ret;
}
void Build(int f){E.Clear();for(int i=1,j=1;i<=m;i++){if(a[i].x==1){if(b[j]^f) E.Add(a[i].x,a[i].y,a[i].s);else E.Add(a[i].y,a[i].x,a[i].t);j++;}else E.Add(a[i].x,a[i].y,a[i].s),E.Add(a[i].y,a[i].x,a[i].t);}
}
void Dijstar(){memset(Dst,63,sizeof(Dst));memset(vis,0,sizeof(vis));Dst[1]=0;Heap.push((HEAP){0,1});while(!Heap.empty()){int x=Heap.top().x,p=Heap.top().p;Heap.pop();if(vis[p]) continue;vis[p]=1;for(int j=E.lnk[p];j;j=E.nxt[j])if(Dst[E.son[j]]>Dst[p]+E.W[j]) Dst[E.son[j]]=Dst[p]+E.W[j],Heap.push((HEAP){Dst[E.son[j]],E.son[j]});}
}
int main(){// freopen("4398.in","r",stdin);
// freopen("4398.out","w",stdout);n=read(),m=read();for(int i=1;i<=m;i++){int x=read(),y=read(),s=read(),t=read();if(x>y) swap(x,y),swap(s,t);a[i]=(xcw){x,y,s,t};}for(int i=1;i<=m;i++) if(a[i].x==1) Len++;for(int p=0;(1<<p)<=Len;p++){for(int i=1;i<=Len;i++) b[i]=(i>>p)&1;Build(0);Dijstar();for(int i=1,j=1;i<=m;i++)if(a[i].x==1){if(!b[j]) Ans=min(Ans,Dst[a[i].y]+a[i].t);j++;}Build(1);Dijstar();for(int i=1,j=1;i<=m;i++)if(a[i].x==1){if( b[j]) Ans=min(Ans,Dst[a[i].y]+a[i].t);j++;}}if(Ans>=Dst[0]) printf("-1\n");else printf("%d\n",Ans);return 0;
}
BZOJ4398: 福慧双修【二进制分组+最短路】相关推荐
- bzoj 4398 福慧双修——二进制分组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 如果枚举1号点走哪些点出去,就从那些点出发跑多源最短路即可.最短路不会重复经过一条边. ...
- bzoj 4398 福慧双修 —— 二进制分组+多起点最短路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 按二进制每一位是 0/1 把 1 号点的儿子分成两组,分别作为起点和终点跑多起点最短路 ...
- 【技巧 二进制分组】bzoj4398: 福慧双修2407: 探险
二进制分组也可以说是一种比较优美的拆贡献方式吧? Description 菩萨为行,福慧双修,智人得果,不忘其本. --唐朠立<大慈恩寺三藏法师传> 有才而知进退,福慧双修,这才难得. - ...
- 【BZOJ2069】ZAW(POI2004)-最短路+二进制分组
测试地址:ZAW 题目大意: 给定一张边是双向的图,一条边走不同的方向可能代价不同,代价都非负,求从点111出发,不经过重复的点或边的最小回路.n≤5000,m≤10000n\le 5000,m\le ...
- [bzoj4398]福慧双修
[bzoj4398]福慧双修 要求不能走重复的边,路径就是1->u->v->1,然后我们可以i想到一个暴力:把1去掉 枚举u跑最短路然后枚举v更新答案.因为边权非负,这个肯定是合法的 ...
- 【福慧双修-这是不是最短路?】
·题目: 如何福慧双修?被太后教导的甄嬛徘徊在御花园当中.突然,她发现御花园中的花朵全都是红色和蓝色的.她冥冥之中得到了响应:这就是指导她如何福慧双修的!现在御花园可以看作是有N块区域,M条 ...
- bzoj29894170数列——二进制分组+主席树
题意的转化挺巧妙的 可以联想到曼哈顿距离! 并且,所谓的修改还要查询历史版本,并且修改之间不动只算一次,不就是给平面上加一个点吗? 看成(x,a[x])的点 就是一个菱形区域 转切比雪夫距离,变成矩形 ...
- 【BZOJ3821/UOJ46】玄学(二进制分组,线段树)
[BZOJ3821/UOJ46]玄学(二进制分组,线段树) 题面 BZOJ UOJ 题解 呜,很好的题目啊QwQ. 离线做法大概可以线段树分治,或者直接点记录左右两次操作时的结果,两个除一下就可以直接 ...
- [bzoj4398] 福慧双修 最短路 二进制分组
---题面--- 题解: 考场上看的这道题,,,当时70分算法打挂了,今天才知道这个也是原题.... 首先,对于不跟1相邻的边,肯定不会经过两次,因为经过两次就回来了,除了增加路径长度之外没有任何意义 ...
最新文章
- 时间段为查询条件时的日期边界查询不到问题
- 翻译:集群索引:通往SQL Server索引级别3的阶梯
- springboot整合alibbaba-dubbo
- Android JNI使用方法
- UI帮手|小样机大作用
- 杀鸡儆猴!苹果撤销Facebook的iOS企业证书
- Unity与 DLL文件 ☀️| 怎样使用 C# 类库 生成一个DLL文件 并 调用!
- oracle odi 资料档案库访问期间出现未分类的异常错误,ODI11g调用DBLink时报ORA-28267: Invalid NameSpace Value错误...
- 为什么前端工程师的工资越来越高了?
- 弦截法及Python实现
- 合唱队形java_动态规划练习题-合唱队形
- 微博营销有什么优势与缺点?如何利用微博开展营销?
- 树莓派4B连接PCF8591模块
- 算法练习:Sequence II
- 数据结构算法常见的 100 道面试题全解析:2019 版
- mysql数据设置有效期_zabbix管理六之数据有效期设置
- 这几天以来寻找、分析单机CS数据的经验心得
- 流星雨直播:都市安魂新曲
- Android记事本
- 基于ssm量贩式ktv管理系统
热门文章
- 九部比《五十度灰》更血脉喷张的电影,个个看完都会让人欲罢不能!
- matlab 沙丁,基于三维空间关于海豚围捕沙丁鱼群的运动规律
- 解决js脚本加载失败的问题
- dnn降噪_可能是周杰伦粉丝必买好物?1MORE降噪圈铁蓝牙耳机PRO版体验
- 雄霸迈阿密java_罪恶都市3之雄霸迈阿密
- 从“中产梦”中醒来,好好打工吧
- 西南大学844信号与系统考研经验(高分上岸学姐)
- 苹果手机来电归属地_工信部:手机号归属地不会取消、否则增大诈骗风险-工信部,手机号,归属地,诈骗 ——快科技(驱动之家旗下媒体)-...
- IOS OC 多态(白话)
- Servlet快速筑基