bzoj#2407-探险【最短路,二进制分组】

正题

题目链接:https://darkbzoj.tk/problem/2407


题目大意

nnn个点的一张无向图(但是正反权值不同),求一个从111出发回到111且不经过重复边的最短路径。
1≤n≤10000,1≤m≤2×1051\leq n\leq 10000,1\leq m\leq 2\times 10^51n10000,1m2×105


解题思路

考虑一个暴力的做法,枚举一条出边枚举一条入边,然后求出去的点到入点的最短路。

但是这样如果点111度数很多就会TTT

但是这种问题配最短路是很经典的套路,因为两个不同的数字至少有一个二进制位不同,所以我们可以枚举一个二进制位,然后这个位为111的当出边,为000的当入边就好了。

时间复杂度O((n+m)log⁡2m)O((n+m)\log^2 m)O((n+m)log2m)


code

#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cctype>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=11000;
struct node{int to,next,w,id,ban;
}a[N*40];
int n,m,tot,ans,ls[N],f[N];bool v[N];
priority_queue<pair<int,int> > q;
inline char Getchar()
{static char buf[100000],*p1=buf+100000,*pend=buf+100000;if(p1==pend){p1=buf; pend=buf+fread(buf,1,100000,stdin);if (pend==p1) return -1;}return *p1++;
}
inline int read()
{char c;int d=1;int f=0;while(c=Getchar(),!isdigit(c))if(c==45)d=-1;f=(f<<3)+(f<<1)+c-48;while(c=Getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;return d*f;
}
void addl(int x,int y,int w,int id){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[tot].id=id;return;
}
void dij(){memset(f,0x3f,sizeof(f));memset(v,0,sizeof(v));q.push(mp(0,1));f[1]=0;while(!q.empty()){int x=q.top().second;q.pop();if(v[x])continue;v[x]=1;for(int i=ls[x];i;i=a[i].next){if(a[i].ban)continue;int y=a[i].to;if(f[x]+a[i].w<f[y]){f[y]=f[x]+a[i].w;q.push(mp(-f[y],y));}}}return;
}
int main()
{tot=1;n=read();m=read();for(int i=1;i<=m;i++){int x=read(),y=read(),w=read(),v=read();addl(x,y,w,i);addl(y,x,v,i);}ans=2147483647;for(int p=0;p<18;p++){for(int i=2;i<=tot;i++)if((a[i].id>>p)&1)a[i].ban=(a[i].to==1);else a[i].ban=(a[i^1].to==1);dij();for(int i=2;i<=tot;i++)if(!a[i].ban&&a[i].to==1)ans=min(ans,f[a[i^1].to]+a[i].w);}printf("%d\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

The 2020 ICPC Asia Macau Regional Contest A. Accelerator(分治+NTT)

A. Accelerator 实质上就是求n个多项式相乘 (a1x)(a2x)…(anx)(a_1x)(a_2x)\dots(a_nx) (a1​x)(a2​x)…(an​x) 对于[xm][x^m][xm]的系数即是从nnn个选出n−mn-mn−m的乘积之和。 每次从nnn个选出n−mn-mn−m的概率显然为 (nm)n!\frac{\binom{n}{m}}{n!} n!(mn​)​ 然后期…

牛客题霸 [栈和排序] C++题解/答案

牛客题霸 [栈和排序] C题解/答案 题目描述 给你一个1->n的排列和一个栈&#xff0c;入栈顺序给定 你要在不打乱入栈顺序的情况下&#xff0c;对数组进行从大到小排序 当无法完全排序时&#xff0c;请输出字典序最大的出栈序列 题解&#xff1a; 栈的性质是先进后出 当栈…

邮局-[IOI2000](四边形不等式)

概要 四边形不等式的核心在于缩小最优转移的范围 题目描述 传送门 解析 这道题说是不等式&#xff0c;但其实也可以感性理解 &#xff08;其实就是不想证明&#xff09; 定义pl[i][k]: i到n的村庄建造k座邮局时&#xff0c;第一座管辖的范围是i-pl[i][k] (也就是最优决策…

.NET Core实战项目之CMS 第九章 设计篇-白话架构设计

前面两篇文章给大家介绍了我们实战的CMS系统的数据库设计&#xff0c;源码也已经上传到服务器上了。今天我们就好聊聊架构设计&#xff0c;在开始之前先给大家分享一下这几天我一直在听的《从零开始学架构》里面关于架构设计的定义以及架构设计的三大原则&#xff0c;希望能对大…

P6847-[CEOI2019]Magic Tree【dp,线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/P6847 题目大意 nnn个点的一棵树上&#xff0c;每个时刻可以割掉一些边&#xff0c;一些节点上有果实表示如果在did_idi​时刻这个点恰好不与111联通&#xff0c;那么就可以获得wiw_iwi​的价值。 1≤n,k≤1051\leq n,k\leq 1…

P3899 [湖南集训]更为厉害(线段树合并、长链剖分、二维数点)

P3899 [湖南集训]更为厉害 若 deepb<deepa\text{deep}_b<\text{deep}_adeepb​<deepa​&#xff1a;c 在点 a 的子树中&#xff0c;根据乘法原理计算答案为 min⁡(deepa,k)∗(sza−1)\min(\text{deep}_a,k)∗(\text{sz}_a−1)min(deepa​,k)∗(sza​−1)若 deepb>…

树链剖分-学习报告

概要 &#xff08;这是笔者刚学完趁热写的博客 由于也是初学&#xff0c;所以可能会对初学读者比较友好吧 毕竟你不明白的地方我可能也迷惑过&#xff09; 学完感觉树链剖分的设计真的很巧妙 其主要用途是压缩树上路径 又是一个n到log的优化 原理 先引定义&#xff1a; 设…

牛客题霸 [拼接所有的字符串产生字典序最小的字符串] C++题解/答案

牛客题霸 [拼接所有的字符串产生字典序最小的字符串] C题解/答案 题目描述 给定一个字符串的数组strs&#xff0c;请找到一种拼接顺序&#xff0c;使得所有的字符串拼接起来组成的字符串是所有可能性中字典序最小的&#xff0c;并返回这个字符串。 题解&#xff1a; 用sort…

今日头条Marketing API小工具(.Net Core版本)

前言由于工作原因&#xff0c;需要用到今日头条的Marketing API做一些广告投放的定制化开发。然后看现在网上也没多少关于头条Marketing API的文章&#xff0c;于是便就有了该篇文章。头条Marketing API主页地址&#xff1a;https://ad.toutiao.com/openapi/index.html。头条Ma…

P6880-[JOI 2020 Final]オリンピックバス【最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P6880 题目大意 给出nnn个点mmm条边的有向图&#xff0c;边有边权和一个翻转权值。 翻转至多一条边使得1−>n−>11->n->11−>n−>1往返的权值加上翻转权值最小。 1≤n≤200,1≤m≤51041\leq n\leq 200,1\…

The 2020 ICPC Asia Macau Regional Contest J. Jewel Grab(数颜色+链表)

J. Jewel Grab Tartarus _Wallace_ 转化询问&#xff1a;对于一个询问 [s,k]&#xff0c;找到一个最长的区间 [s,t]&#xff0c;满足区间中出现次数超过一次的元素&#xff0c;的出现次数减一&#xff0c;的和&#xff0c;不超过 k。 对于该区间[s,t] 区间数颜色&#xff1a;…

牛客题霸 [最大数] C++题解/答案

牛客题霸 [最大数] C题解/答案 题目描述 给定一个数组由一些非负整数组成&#xff0c;现需要将他们进行排列并拼接&#xff0c;使得最后的结果最大&#xff0c;返回值需要是string类型 否则可能会溢出 题解&#xff1a; 将字符串存入vector中然后sort排序&#xff0c;最后将…

模板:割点、桥与双连通

文章目录割点代码桥点双连通分量代码边双连通分量代码割点 和强连通分量十分相似 分为树枝边、前向边和后向边 注意&#xff01; if(x!r&&low[to]>dfn[x]) cut[x]1;这句判断只能在树枝边出现 否则会因为前向边的存在而出错 代码 #include<bits/stdc.h> us…

.NET Core实战项目之CMS 第十章 设计篇-系统开发框架设计

这两天比较忙&#xff0c;周末也在加班&#xff0c;所以更新的就慢了一点&#xff0c;不过没关系&#xff0c;今天我们就进行千呼万唤的系统开发框架的设计。不知道上篇关于架构设计的文章大家有没有阅读&#xff0c;如果阅读后相信一定对架构设计有了更近一部的理解&#xff0…

喝酒、工作与自律

喝酒 自从开始打算品酒之后&#xff0c;家里的小酒数量不断增加&#xff0c;每天晚上喝个15ml&#xff0c;慢慢也能喝出一些区别了。 酱香、清香、浓香的区别还是挺明显的&#xff0c;闻香就能区别出来 浓香里的五粮液特点很明显&#xff0c;闻的时候有粮香&#xff0c;入口后…

51nod1836-战忽局的手段【期望dp,矩阵乘法】

正题 题目连接:http://www.51nod.com/Challenge/Problem.html#problemId1836 题目大意 nnn个点mmm次随机选择一个点标记&#xff08;可以重复&#xff09;&#xff0c;求最后被标记点的期望个数。 1≤n,m≤10181\leq n,m\leq 10^{18}1≤n,m≤1018 解题思路 额开始拿方案数推了…

分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0

今年五月的 Build 大会上&#xff0c;微软说 .NET Core 3.0 将带来 WPF / Windows Forms 这些桌面应用的支持。当然&#xff0c;是通过 Windows 兼容包&#xff08;Windows Compatibility Pack&#xff09;实现的。为了提前检查你的程序是否能在未来跑在 .NET Core 3.0 上&…

第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明) Stone Games

Stone Games 主席树 Code1 #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N1000010; using lllong long; const ll MAX1000000000ll; int n,a[N],m; struct node {int l,r;ll v; }tree[N*40]; int root[N],c…

路径求和(ybtoj-树形dp)

文章目录题目描述解析代码题目描述 给出一棵带边权的树&#xff0c;求所有至少有一个端点为叶节点的所有简单路径的长度和 解析 换一个角度想 考虑将树分割为AB两部分的一条边会存在于多少条符合条件的路径中&#xff08;也就是边权会考虑多少次&#xff09; 不难发现&#…

51nod1675-序列变换【莫比乌斯反演】

正题 题目连接:http://www.51nod.com/Challenge/Problem.html#problemId1675 题目大意 给出两个长度为nnn的序列a,ba,ba,b&#xff0c;求有多少对x,yx,yx,y满足 gcd(x,y)1且abxbaygcd(x,y)1且a_{b_x}b_{a_y}gcd(x,y)1且abx​​bay​​ 1≤n≤105,1≤ai,bi≤n1\leq n\leq 10^5…