【floyd】【bitset】洛谷 P1841 [JSOI2007]重要的城市 题解

 

    bitset玄学完美优化复杂度?

 

题目描述

参加jsoi冬令营的同学最近发现,由于南航校内修路截断了原来通向计算中心的路,导致去的路程比原先增加了近一公里。而食堂门前施工虽然也截断了原来通向计算中心的路,却没有使路程增加,因为可以找到同样长度的路作替代。其实,问题的关键在于,路截断的地方是交通要点。

 

同样的情况也出现在城市间的交通中。某些城市如果出了问题,可能会引起其他很多城市的交通不便。另一些城市则影响不到别的城市的交通。jsoi冬令营的同学发现这是一个有趣的问题,于是决定研究这个问题。

 

他们认为这样的城市是重要的:如果一个城市c被破坏后,存在两个不同的城市a和b(a, b均不等于c),a到b的最短距离增长了(或不通),则城市c是重要的。

 

jsoi冬令营的同学面对着一张教练组交给他们的城市间交通图,他们希望能找出所有重要的城市。现在就请你来解决这个问题。

 

输入输出格式

输入格式:

第一行两个整数N,M,N为城市数,M为道路数。

 

接下来M行,每行三个整数,表示两个城市之间的无向边,以及之间的路的长度。

 

输出格式:

一行,按递增次序输出若干的数,表示重要的城市。

 

如果没有点的话需要输出一行

“No important cities.”

去掉引号。

 

输入输出样例

输入样例#1:

4 4
1 2 1
2 3 1
4 1 2
4 3 2

输出样例#1:

2

说明

30%的数据:$N\le 20$;

 

60%的数据:$N\le 100$;

 

100%的数据:$N\le 200,M\le \frac{N\times (N-1)}{2},0<c\le 10000$。$c$即路的长度。

 

保证不出现重边和自环

 

感谢@赵昕鹏 和@qq2477259579 提供程序

 

题解:

    因为Floyd是一种玄学DP思想,所以它的状态更新来源有很多,在这个题里需要整理出它的阶段性与转移,看上去十分麻烦。而我们如果把Floyd当作最短路算法中的松弛,就是相当于在把两段最短路拼接在一起,拥有它们合在一起的性质。

 

重要城市

    重要城市就是如果这个点被删掉,那么最短路的长度就会改变。因此这个点一定在最短路上。而当两点间的最短路有多条时,它们上的点不一定都是重要城市,经过分析我们可以这样理解:设$(u,v)$间最短路条数为$k$,重要城市为$p$,那么这$k$条最短路一定都经过点$p$。用反例来说明,就是如果不是$k$条最短路都经过点$p$,那么去掉点$p$,还有剩下的最短路可以走,则不合法。

 

    因此我们可以开一个三维数组$im[i][j][k]$表示k在$latex i,j$的几条最短路上。而我们用floyd做最短路计数也比较方便,一旦$k$所在的最短路数量与$(i,j)$间的最短路数量相同,那么$k$就一定是一个重要城市,判断条件为$im[i][j][k]==cnt[i][j]\Rightarrow k$是重要城市。

    在上图中,1→8最短路计数为3,其中除了起点和终点,被经过了3次的点的点有2和7,因此它们是这条路径上的重要城市。

 

    因为floyd的时间复杂度为$O(N^3)$,而每次更新还要循环一个$N$,因此总时间复杂度为$O(N^4)$。

 

bitset优化

    我们在上面提到,状态合并/更新需要额外枚举一个$O(N)$,我们可不可以把这个$N$省掉,或者说优化一点呢?

 

    这时可以考虑bitset,bitset可以使常数优化32倍,这个题的$latex N$规模才200,优化一个32就快把一个$N$变成一个$\log N$了,这个题的数据规模还是可以承受的。不过bitset存的是二进制啊,可是上面提到的数组存的是计数啊。

 

    我们可以换一个方式想想,如果这两个点之间已经找到了4条最短路,其中有3条经过点$p$,那此时$p$已经不合法了,就直接把它置为0,以后尽管所有路径都经过$p$,它也不可能是关键城市。

 

    因此bitset中im[i][j][k]里面存的是,现有状态下,k是不是i到j最短路上的关键城市。当更新(松弛)最短路时,关键城市是两段最短路上的关键城市之并集;而更新最短路计数,也就是找到了一条新的最短路时,如上图,就要取交集,因为一个城市只有在两点间任何一条最短路上都存在,才能作为这两点间的关键城市。而交集并集在位运算中就是and(&)和or(|),而点集有200,普通的位运算完成不了,就让bitset来做。

 

    在一开始初始化时,把两个连接在一起的点上的关键城市设为两个端点,在floyd“松弛”最短路时,直接把两段最短路的关键城市“拼起来”,就是新的最短路上的关键城市。最后判断用$O(N^3)$遍历,看一个点是否为某两个点之间的关键城市,不过要注意不能与这两个点重合,因为为了方便,一开始我们把起点和终点也定为关键城市(符合关键城市的一般定义)。

 

    因此这道题的总复杂度为$O(\frac{N^4}{32}+N^3)$

 

Code:

#include<cstdio>
#include<cstring>
#include<bitset>
using std::bitset;
bitset<210> im[210][210];
int f[210][210];
int is[210];
int main()
{memset(f,0x3f,sizeof(f));int u,v,n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)f[i][i]=0;for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);scanf("%d",&f[u][v]);f[v][u]=f[u][v];}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){im[i][j][i]=1;//初始化设两端为重要城市im[i][j][j]=1;}for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(f[i][k]+f[k][j]==f[i][j])im[i][j]&=(im[i][k]|im[k][j]);//当更新计数时取交集else if(f[i][k]+f[k][j]<f[i][j])//当更新最短路时直接赋值为两段的并集{f[i][j]=f[i][k]+f[k][j];im[i][j]=im[i][k]|im[k][j];}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)if(k!=i&&k!=j)//注意特判if(im[i][j][k])is[k]=1;int flag=0;for(int i=1;i<=n;i++)if(is[i]){flag=1;printf("%d ",i);}if(!flag)//注意判断无解puts("No important cities.");return 0;
}

  

转载于:https://www.cnblogs.com/wjyyy/p/lg1841.html

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

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

相关文章

新风口下:嵌入式AI学习中较好的练手项目(附代码资料/学习视频/学习规划)...

有粉丝问我&#xff1a;“当前乃至未来5-10年&#xff0c;嵌入式开发者还有哪些风口&#xff1f;”画外音&#xff1a;风口的本质&#xff0c;其实就是一段时间的人才供需不平衡。说白了就是由于行业突变&#xff0c;敏锐的资本快速进入&#xff0c;导致短时间内行业大量扩张&a…

Windows 任务栏缩略图自定义程序[更新 Build20100830]

很久没有写一点小玩意儿了&#xff0c;今天终于有了一次机会。这个程序能够对 Windows 7 中的任务栏实时预览缩略图进行一系列个性化的调整&#xff0c;使其使用起来更炫更方便&#xff0c;避免了不方便的注册表修改操作&#xff0c;将其转化为方便图形界面&#xff0c;只需要点…

我接的是地啊,不,你接的是土!

作者&#xff1a;晓宇&#xff0c;排版&#xff1a;晓宇微信公众号&#xff1a;芯片之家&#xff08;ID&#xff1a;chiphome-dy&#xff09;1、我接地了啊&#xff0c;电子设计中&#xff0c;接地是非常重要的&#xff0c;地可不等于土&#xff0c;哈哈&#xff0c;有效的接地…

邻接矩阵-建立图

1.介绍图的相关概念 图是由顶点的有穷非空集和一个描述顶点之间关系-边&#xff08;或者弧&#xff09;的集合组成。通常&#xff0c;图中的数据元素被称为顶点&#xff0c;顶点间的关系用边表示&#xff0c;图通常用字母G表示&#xff0c;图的顶点通常用字母V表示&#xff0c;…

Busybox 制作文件系统并用 Qemu 启动编译的内核镜像

编译内核操作&#xff1a;https://blog.csdn.net/assiduous_me/article/details/120938556安装Busybox操作&#xff1a;https://blog.csdn.net/assiduous_me/article/details/120939319syzDESKTOP-B10G93S:~$ ls -l total 20 drwxr-xr-x 44 syz syz 4096 Oct 26 22:05 busybox …

深入浅出Win32多线程程序设计之线程通信

简介  线程之间通信的两个基本问题是互斥和同步。  线程同步是指线程之间所具有的一种制约关系&#xff0c;一个线程的执行依赖另一个线程的消息&#xff0c;当它没有得到另一个线程的消息时应等待&#xff0c;直到消息到达时才被唤醒。  线程互斥是指对于共享的操作系统…

Kafka Producer源码简述

接着上文kafka的简述&#xff0c;这一章我们一探kafka生产者是如何发送消息到消息服务器的。 代码的入口还是从 kafkaTemplate.send开始 最终我们就会到 org.springframework.kafka.core.KafkaTemplate#doSend方法 这里的关键就是 org.apache.kafka.clients.producer.Producer#…

原来搞单片机也可以面向对象

摘要&#xff1a;在看别人单片机程序时&#xff0c;你也许是奔溃的&#xff0c;因为全局变量满天飞&#xff0c;不知道哪个在哪用了&#xff0c;哪个表示什么&#xff0c;而且编写极其不规范。自己写单片机程序时&#xff0c;也许你也是奔溃的。总感觉重新开启一个项目&#xf…

雅虎年底升级IPv6标准 100万用户恐受影响

雅虎年底升级IPv6标准 100万用户恐受影响 http://network.51cto.com 2011-01-20 17:34 佚名 cnBeta 我要评论(0) 据国外媒体报道&#xff0c;雅虎计划今年年底将主站点Yahoo.com升级为IPv6标准&#xff0c;此举可能会使约100万用户在初期无法访问雅虎站点。据国外媒体报道&…

Linux v4l2框架分析

背景说明&#xff1a;Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio1. 概述V4L2(Video for Linux 2)&#xff1a;Linux内核中关于视频设备驱动的框架&#xff0c;对上向应用层提供统…

JAVA自学笔记23

JAVA自学笔记23 1、多线程 1&#xff09;引入&#xff1a; 2&#xff09;进程 是正在运行的程序。是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。 多进程&#xff1a; 单进程的计算机只能做一件事情&#xff0c;而现在的计算机都可以做…

上午写了一段代码,下午就被开除了~

俗话说得好&#xff0c;“代码写的少&#xff0c;离职少不了”。最近畅游互联网&#xff0c;发现一些离职小技巧&#xff0c;读后&#xff0c;内心被深深地打动了……但是&#xff0c;细细品过之后&#xff0c;发现对我们程序员不太适用了。例如&#xff1a;领导夹菜你转桌&…

nginx加载html目录下图片,nginx配置访问图片路径以及html静态页面的调取方法

nginx配置访问图片路径以及html静态页面的调取方法发布时间&#xff1a;2017-03-09 12:06来源&#xff1a;互联网当前栏目&#xff1a;web技术类给大家讲一个快速配置nginx访问图片地址&#xff0c;以及访问html静态页面的配置。1.实验环境首先随便某个路径下创建相应的目录。如…

微信小程序继续入坑指南

微信小程序继续入坑指南 wxml 类似于html 感觉和ejs灰常的相似 数据绑定 js Page({data: {message: "hello world"} })wxml <view>{{message}}</view> 使用的是https://mustache.github.io/模板引擎系统 对组件的属性和控制属性的更改 <view id"…

思科收购网络安全管理厂商Pari Networks

思科收购网络安全管理厂商Pari Networkshttp://netsecurity.51cto.com 2011-01-28 09:39 胡杨 译 网界网 我要评论(0)摘要&#xff1a;思科本星期宣布&#xff0c;它打算收购私营企业Pari Networks。这个企业是前思科工程师创建的&#xff0c;主要提供网络配置、变更和合规…

20年软件工程师的经验

软件工程师在做设计的时候&#xff0c;一定要有设计的思维&#xff0c;码农如果只是砌砖的&#xff0c;那么他的可替代性和技能能力并不高。前段时间看到一个设计师傅&#xff0c;在很狭小的空间内设计了非常非常不错的室内设计&#xff0c;利用了每一个可以利用的地方。如果我…

html超市代码,前端 CSS : 5# 纯 CSS 实现24小时超市

介绍原文链接感謝 comehope 大佬的 [前端每日实战]效果预览源代码地址代码解读1. html 结构命名规则使用了 BEM常规样式初始化* {margin: 0;padding: 0;box-sizing: border-box;}body {height: 100vh;overflow: hidden;}2. 街道背景街道背景分为两部分深蓝色的天空.street {hei…

送30块树莓派PICO 开发板!

大家好&#xff0c;今天是周日&#xff0c;给大家搞个小抽奖&#xff0c;送30块。嵌入式猛男必备&#xff0c;学嵌入式看『我要学嵌入式』&#xff0c;知识持久有力。点击关注&#xff0c;回复【1031】参与抽奖&#xff0c;免费送 10块 树莓派最新PICO开发板。学C语言看『写代码…

嘉立创又搞大事情了,与你我相关!

你们一定不知道嘉立创最近又悄咪咪的做了一件大事儿&#xff0c;硬创社硬件项目共享平台上线公测啦&#xff0c;这是一个帮助电子工程师实现技术变现的平台&#xff0c;平台刚刚上线公测&#xff0c;前期还在邀请电子工程师填充内容阶段&#xff0c;即日起平台每上传一个项目就…

c html联调,JS与native 交互简单应用

JS与native 交互简单应用一、objectiveC 语法简介二、简易项目浏览器搭建新建项目步骤&#xff1a;1>DraggedImage.png2>2222.png3>33333.png4>4444.png建立一个小的浏览器即webview关键代码如下&#xff1a;// context 上下文也可以在此处获取&#xff0c;开始加载…