那一天她离我而去 (二进制分组建图)

news/2024/9/18 3:43:22/文章来源:https://www.cnblogs.com/zhengchenxi/p/18356130

首先比较好想的是断边跑dij,虽然能过(数据太水),但是可以被菊花图给卡掉。

那我们就考虑怎样可以降低复杂度,图论唯一能优化的应该就是建图了吧。

这里我们就可以进行分组最短路,通过二进制来确保分组的正确性,因为任意两个不同的点,二进制一定至少存在一位不同。于是我们以每个二进制位的0,1进行分组,每组点组成的环至少被更新一次。

点击查看代码
#include<bits/stdc++.h>
using namespace std;const int N=5e5+107;
int n,m,e,f;int read()
{int f=1,s=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}return f*s;
}int h[N<<1],to[N],nxt[N],w[N],tot;
void add(int x,int y,int dt)
{to[++tot]=y;nxt[tot]=h[x];w[tot]=dt;h[x]=tot;
}priority_queue<pair<int,int>>q;
bool vis[N];
int dis[N];
void dij(int x)
{memset(dis,0x3f,sizeof dis);memset(vis,0,sizeof vis);dis[x]=0;q.push(make_pair(-dis[x],x));while(!q.empty()){// cout<<"!!";x=q.top().second;q.pop();if(x==f) return ;if(vis[x]) continue;vis[x]=1;for(int i=h[x];i;i=nxt[i]){int y=to[i];// vis[y]=1;if(dis[y]>dis[x]+w[i]){dis[y]=dis[x]+w[i];if(!vis[y]){q.push(make_pair(-dis[y],y));}}}}
}int cnt;
struct lmy
{int y,w;
}c[N];void clear()
{memset(h,0,sizeof h);tot=2; cnt=0;
}int main()
{// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);int T=read();while(T--){clear();int ans=0x3f3f3f3f;n=read(),m=read();for(int i=1;i<=m;i++){int x=read(),y=read(),dt=read();if(x>y) swap(x,y);if(x==1) c[++cnt]={y,dt};else add(x,y,dt),add(y,x,dt);}int z=n;for(int i=1;i<=n;i<<=1){e=++z,f=++z;for(int j=1;j<=cnt;j++){if(c[j].y&i) add(e,c[j].y,c[j].w);else add(c[j].y,f,c[j].w);}dij(e);ans=min(ans,dis[f]);}if(ans==0x3f3f3f3f) ans=-1;printf("%d\n",ans);}return 0;
}

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

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

相关文章

mysql: auth_socket登录

一,默认安装的mysql用户root是auth_socket方式登录 root@localhost的authentication_string为空, 它的plugin为auth_socket二,如何登录? 1,从命令行正常登录会报错: liuhongdi@lhdpc:/data/site/gsapi$ mysql -u root -h localhost -p Enter password: ERROR 1698 …

pbootcms网站是使用sqlite数据库好还是使用mysql数据库好?

众多周知pbootcms程序支持sqlite数据库和mysql数据库,目前默认常用最多的是sqlite数据库,有需要转成mysql数据库的可以联系我们。 pbootcms数据库sqlite无缝转换mysql数据库 本人从接触pbootcms开始一直都是使用mysql数据库,很少出现被黑和各种不明原因报错。 建议有条件的…

仿肯德基,麦当劳饭店餐饮外卖点餐小程序APP源码搭建

这是后台基于ThinkPHP8 + 野兔后台管理系统 + uniapp框架开发的,APP端跟小程序差不多的,有点类似肯德基,麦当劳,喜茶外卖点餐小程序APP开发建设,支持 多店铺模式,支持子商户模式等。系统名称:野兔在线工具系统系统语言:支持多语言,大概有20种系统源码:不加密,开源程…

pbootcms网站搬家到新服务器后 前台数据显示不完全是什么原因

pbootcms搬家到新服务器后发现列表页面很多新闻不显示,后台都没有任何问题。 后台显示100条新闻,都没有任何问题,但是前台只显示60多条。 检查缓存都没有任何问题,网站也没有被黑。 各种检查都没有问题,最后发现是服务器时间的问题,服务器时间还停留在上月份。 所以造成没…

pbootcms后台左侧管理菜单怎么删除及修改

pbootcms后台左侧某些菜单用不到或者是不想让用户看到,需要屏蔽或者修改掉,怎么搞? 其实pbootcms后台默认已经有这个菜单的管理功能。 首先我们使用超级管理员登录网站后台,手动访问这个链接(如:http://www.xxxxx.com/admin.php/Menu/index)。我们只需要勾选菜单状态即可…

Oracle数据库US7ASCII字符集中文乱码

最近遇到一家客户的Oracle数据库,版本是11g,字符集是US7ASCII,当使用PL/SQL Developer工具插入和查询中文时都没问题,但是Java程序使用JDBC插入和查询中文时,中文乱码。 比如a中文b通过JDBC查询出来的乱码是这样的aᅱ￐ᅫᅣb查询了一些资料,看到有网友通过这种方式解决了…

VF01/VF02/VF03屏幕增强及BAPI增强字段处理

1.在销售发票抬头表中增加增强字段2.创建处理程序 主程序SAPMV60A中的所有包含文件都是以MV60AF打头的,所以我们创建一个独立的程序 SE38(ZSDU0001) 来存放所有的处理代码 创建屏幕9001,确保屏幕类型为子屏幕 屏幕字段可从VBRK表中获取*&--------------------------------…

GameSalad-IOS-游戏开发学习手册-全-

GameSalad IOS 游戏开发学习手册(全)原文:Learn GameSalad for iOS Game Development for iPhone, iPad, and HTML5 协议:CC BY-NC-SA 4.0零、简介 2007 年,苹果推出了 iPhone,彻底改变了我们的生活方式,但最重要的是 iOS 的诞生。今天,iOS 被用于 iPhone、iPad 和 iPo…

问题 IDEA创建Sping项目只能勾选17和21,却无法使用Java8

想创建一个springboot项目,本地安装jdk版本为1.8,但是在使用 Spring Initializr创建项目时,版本只能选择21或17 在JDK为1.8的情况下,无论选择Java17版本或者21版本时,都会报错。 Java17和Java 8(JDK1.8)的区别 版本号:Java 17 是 Java SE 17 的版本,而 JDK 1.8 是 Java S…

软件逆向之OD

OD全称OllyDbg ,是一种具有可视化界面的 32 位汇编-分析调试器。和IDA不同之处在于可以动态调试软件功能,可以有效的去分析程序构成。 以下软件讲解均以吾爱破解中的OD进行讲解。软件下载 打开程序主页面我们可以看到以下内容首先介绍一下软件主页面的4个窗口: 反汇编窗口:…

vue随笔

插值语法中可以使用三元表达式