[loj3524]钥匙
由于到达关系具有传递性,可以考虑不断将若干个可以相互到达的点缩点,并且当两个点只能单向到达时,能到达另一个点的点一定不是最小值
由此,我们来考虑dfs,即不断从一个节点开始,遍历其可以到达的点,当发现了环即将这些点合并(启发式合并),当发现了已经完全搜过(不在栈中)的点即一定不能作为最小值
在实现上,有一些困难,注意以下细节:
1.对每一个点还要维护一个钥匙集合,也参与启发式合并
2.启发式合并时可能有新的边可以到达,在加入时判定即可
3.由于要弹出元素,且不像强连通分量一样保证必然弹出,因此建议手动模拟栈来实现
4.在搜过一条边后将其弹出边集,以避免合并后被其他点重复搜索
5.判定是否遍历到只能单向到达的点,可以在搜索结束后再判定


1 #include<bits/stdc++.h>
2 #include"keys.h"
3 using namespace std;
4 #define N 300005
5 #define vi vector<int>
6 #define fi first
7 #define se second
8 stack<int>st;
9 set<int>key[N];
10 set<int>::iterator it1;
11 vector<int>ans,G0[N];
12 set<pair<int,int> >G1[N];
13 set<pair<int,int> >::iterator it2;
14 int n,m,mn,dfn[N],vis[N],f[N],sz[N];
15 int find(int k){
16 if (k==f[k])return k;
17 return f[k]=find(f[k]);
18 }
19 int get_sum(int k){
20 return key[k].size()+G0[k].size()+G1[k].size();
21 }
22 void add(int x,int y,int z){
23 x=find(x);
24 if (key[x].find(z)!=key[x].end())G0[x].push_back(y);
25 else G1[x].insert(make_pair(z,y));
26 }
27 void merge(int x,int y){
28 x=find(x),y=find(y);
29 if (x==y)return;
30 if (get_sum(x)<get_sum(y))swap(x,y);
31 f[y]=x;
32 sz[x]+=sz[y];
33 for(it1=key[y].begin();it1!=key[y].end();it1++){
34 int k=(*it1);
35 key[x].insert(k);
36 while (1){
37 it2=G1[x].lower_bound(make_pair(k,0));
38 if ((it2==G1[x].end())||((*it2).fi!=k))break;
39 G0[x].push_back((*it2).se);
40 G1[x].erase(it2);
41 }
42 }
43 key[y].clear();
44 for(int i=0;i<G0[y].size();i++)G0[x].push_back(G0[y][i]);
45 G0[y].clear();
46 for(it2=G1[y].begin();it2!=G1[y].end();it2++)add(x,(*it2).se,(*it2).fi);
47 G1[y].clear();
48 }
49 void dfs(int k){
50 st.push(k);
51 while (!st.empty()){
52 k=st.top();
53 dfn[k]=1;
54 if (G0[k].empty()){
55 vis[k]=1;
56 st.pop();
57 continue;
58 }
59 int x=find(G0[k].back());
60 G0[k].pop_back();
61 if (!dfn[x]){
62 st.push(x);
63 continue;
64 }
65 if (vis[x])continue;
66 while (st.top()!=x){
67 merge(st.top(),k);
68 st.pop();
69 }
70 merge(st.top(),k);
71 st.pop();
72 st.push(find(k));
73 }
74 }
75 void check(int x,int y,int z){
76 x=find(x),y=find(y);
77 if (x!=y){
78 if (key[x].find(z)!=key[x].end())vis[x]=1;
79 if (key[y].find(z)!=key[y].end())vis[y]=1;
80 }
81 }
82 vi find_reachable(vi r,vi u,vi v,vi c){
83 n=r.size(),m=u.size();
84 for(int i=1;i<=n;i++){
85 f[i]=i,sz[i]=1;
86 key[i].insert(r[i-1]);
87 }
88 for(int i=0;i<m;i++){
89 u[i]++,v[i]++;
90 add(u[i],v[i],c[i]);
91 add(v[i],u[i],c[i]);
92 }
93 for(int i=1;i<=n;i++)
94 if (!dfn[i])dfs(i);
95 memset(vis,0,sizeof(vis));
96 for(int i=0;i<m;i++)check(u[i],v[i],c[i]);
97 mn=0x3f3f3f3f;
98 for(int i=1;i<=n;i++)
99 if (!vis[find(i)])mn=min(mn,sz[find(i)]);
100 for(int i=1;i<=n;i++)
101 if ((!vis[find(i)])&&(sz[find(i)]==mn))ans.push_back(1);
102 else ans.push_back(0);
103 return ans;
104 }
[loj3524]钥匙的更多相关文章
- DAY6 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单
设置防火墙策略时,关于SSH:22访问权限,我们常常会设置服务器只接受某个固定IP(如公司IP)访问,但是当我们出差或在家情况需要登录服务器怎么办呢? 常用两种解决方案:1.通过VPN操作登录主机: ...
- wifi万能钥匙自媒体平台开放注册(付注册流程)
12月13日,有网友爆料,wifi万能钥匙自媒体开放注册,看来自媒体还没有达到饱和阶段,也印证了自媒体时代才刚刚到来.现在这个自媒体的时代,几乎大多互联网企业都开通了自己的自媒体,比较知名的像今日头条 ...
- 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单
设置防火墙策略时,关于SSH:22访问权限,我们常常会设置服务器只接受某个固定IP(如公司IP)访问,但是当我们出差或在家情况需要登录服务器怎么办呢? 常用两种解决方案:1.通过VPN操作登录主机: ...
- 使用HackRF+GNU Radio 破解吉普车钥匙信号
引文 我最近对软件定义的无线电技术(SDR)产生了浓厚的兴趣,而我对其中一款流行的SDR平台(HackRF)也产生了兴趣,而其频率接收的范围也在1MHz ~6GHz之间(范围较广).而这里也需要提及一 ...
- HDU-1438 钥匙计数之一
http://acm.hdu.edu.cn/showproblem.php?pid=1438 钥匙计数之一 Time Limit: 200 ...
- 手机NFC通信的安全车钥匙
SmartKeys for Cyber-Cars:Secure Smartphone-based NFC-enabled Car Immobicizer 手机NFC通信的安全车钥匙 1概述 如今,智能 ...
- 钥匙计数之一 - HDU 1438(状态压缩打表)
分析:首先想到每个钥匙的结尾有4种状态,不过题目还需要判断有三种不同的钥匙深度,所以每种深度结尾后有2^4种状态,0000->1111,不过题目还需需要有相邻的钥匙深度大于等于3,所以需要两种不 ...
- [转]使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单
原文链接:使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单 这个留待后面玩一下,还是有安全隐患,非核心业务 临时用一下可以. 设置防火墙策略时,关于SSH:22访问权限, ...
- Wi-Fi万能钥匙:说是破解,其实有危险(转)
Wi-Fi 万能钥匙如此危险,怎样做才能让这种可能严重侵害公众利益的 app 在中国消失? 这个“钥匙”为什么能够破解 Wi-Fi?它真的是“破解” Wi-Fi 吗?两年前我就有这个疑问了,原谅我对一 ...
随机推荐
- redis 5.0.12 install
redis 5.0.12 install ## check directory ls -l /XXXXXXX ##create dir mkdir -p /XXXXXXX/dataredis mkdi ...
- 峰值利用率80%+,视频云离线转码自研上云TKE实践
作者 刘兆瑞,腾讯云高级研发工程师,负责腾讯明眸极速高清,画质重生等产品.专注于codec优化,画质增强等技术. 背景和问题 随着流量资费的降低和带宽的增加,视频成为人们获取信息越来越重要的方式,随之 ...
- Jmeter使用问题记录
Jmeter下载安装,设置中文,返回值乱码处理,下载接口测试 下载地址 解压后,在Jmeter的bin文件夹下启动 修改默认启动为中文简体:打开bin目录下的jmeter.properties文件,在 ...
- Serverless 如何在阿里巴巴实现规模化落地?
作者 | 赵庆杰(卢令) 来源 | Serverless 公众号 一.Serverless 规模化落地集团的成果 2020 年,我们在 Serverless 底层基建上做了非常大的升级,比如计算升级到 ...
- WPF之资源专题
1.一般程序的资源可以分为四个等级: 数据库中的数据相当于放在仓库里 资源文件里的数据相当于放在旅行箱里 WPF对象资源里的数据相当于携带在背包里 变量中的数据相当于拿在手里 2.资源的查找顺序是沿着 ...
- 苹果的最新MacbookPro,炸到你了么?
一 苹果秋季发布会如期而至.我不是一个标准的果粉.但是我今年用上了macbook pro m1,最期待的就是新款的搭载了M1X的Macbook. 苹果官方也放出了要炸翻全场的宣传语... 这次发布会围 ...
- 这部分布式事务开山之作,凭啥第一天预售就拿下当当新书榜No.1?
大家好,我是冰河~~ 今天,咱们就暂时不聊[精通高并发系列]了,今天插播一下分布式事务,为啥?因为冰河联合猫大人共同创作的分布式事务领域的开山之作--<深入理解分布式事务:原理与实战>一书 ...
- netty系列之:netty对http2消息的封装
目录 简介 http2消息的结构 netty对http2的封装 Http2Stream Http2Frame 总结 简介 无论是什么协议,如果要真正被使用的话,需要将该协议转换成为对应的语言才好真正的 ...
- [软工顶级理解组] Beta阶段项目展示
目录 团队成员 软件介绍 项目简介 预期典型用户 功能描述 预期目标用户数 用户反馈 团队管理 分工协作 项目管理 取舍平衡 代码管理 程序测试 代码规范 文档撰写 继续开发指导性 用户沟通 需求分析 ...
- BUAA2020软工作业(五)——软件案例分析
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件案例分析作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方面 ...