bzoj3569 DZY Loves Chinese II
时间:2020-05-25
本文章向大家介绍bzoj3569 DZY Loves Chinese II,主要包括bzoj3569 DZY Loves Chinese II使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
problem
给出一个\(n\)个点\(m\)条边的无向图,然后有\(Q\)次询问,每次询问会给出\(k\)条边,你需要回答删掉这\(k\)条边之后这个无向图还是不是连通。
\(n\le 10^5,m\le 5\times 10^5,k\le 15\)
solution
先找出一个\(dfs\)树,考虑在什么情况下无向图会变得不连通。
当且仅当存在一条树边,满足所有覆盖这条树边的返祖边和这条树边都被删除时,无向图不连通。
那么如何判断是不是存在这样一条树边呢,我们可以给每条返祖边随机一个权值,每条树边的权值就是所有覆盖它的返祖边的权值异或和。对于一次查询,如果查询的边权线性相关说明一定能找到一个子集异或和为0,也就是满足无向图不连通的条件了。
code
/*
* @Author: wxyww
* @Date: 2020-05-25 16:14:15
* @Last Modified time: 2020-05-25 16:47:10
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
#include<cmath>
using namespace std;
typedef long long ll;
const int N = 500100;
ll read() {
ll x = 0,f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1; c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + c - '0'; c = getchar();
}
return x * f;
}
int n,m;
struct node {
int v,nxt,w,id;
}e[N << 1];
int head[N],ejs = 1;
void add(int u,int v,int id) {
e[++ejs].v = v;e[ejs].nxt = head[u];head[u] = ejs;e[ejs].id = id;
}
int vis[N],w[N];
void dfs1(int u,int fa) {
vis[u] = 1;
for(int i = head[u];i;i = e[i].nxt) {
int v = e[i].v;
if(e[i].w || v == fa) continue;
if(vis[v]) {
e[i].w = e[i ^ 1].w = rand() + 1;
w[u] ^= e[i].w;w[v] ^= e[i].w;
continue;
}
dfs1(v,u);
}
}
void dfs2(int u,int fa) {
for(int i = head[u];i;i = e[i].nxt) {
int v = e[i].v;if(v == fa || e[i].w) continue;
dfs2(v,u);
w[u] ^= w[v];
e[i].w = e[i ^ 1].w = w[v];
}
}
int cnt,p[32];
int ins(int x) {
// printf("!!!%d\n",x);
for(int i = 30;i >= 0;--i) {
if(x >> i & 1) {
if(!p[i]) {p[i] = x;return 1;}
x ^= p[i];
}
}
return 0;
}
void solve() {
int k = read(),flag = 0;
for(int i = 1;i <= k;++i) {
int x = read() ^ cnt;
// printf("%d ",x);
if(flag) continue;
if(!ins(e[x << 1].w)) {
puts("Disconnected");
flag = 1;
continue;
}
}
// puts("");
if(!flag) {
++cnt;
puts("Connected");
}
}
int main() {
// freopen("1.in","r",stdin);
n = read(),m = read();
for(int i = 1;i <= m;++i) {
int u = read(),v = read();
add(u,v,i);add(v,u,i);
}
dfs1(1,0);
dfs2(1,0);
int Q = read();
while(Q--) {
memset(p,0,sizeof(p));
solve();
}
return 0;
}
原文地址:https://www.cnblogs.com/wxyww/p/bzoj3569.html
- 《深入理解C# 3.x的新特性》博文系列汇总
- 十一国庆节 之 “变量与函数同名时,会输出谁?”
- 挖坑无止境,来看看这个《this的指向》
- T-SQL Enhancement in SQL Server 2005[上篇]
- 初学js钻太深,不太好
- Linux shell 程序设计3——命令行程序
- Linux shell 程序设计2——bash的内置命令
- T-SQL Enhancement in SQL Server 2005[下篇]
- JS原型,a和b是不是失散多年的兄弟?
- Linux shell 程序设计1——安装及入门
- 偶遇--《坑新人--前端专用面试题》
- 简单的说下,(function(){...})() 与 (function(){...}()) 有什么区别?
- ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline[上篇]
- Shell常用命令小结
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- laravel excel 上传文件保存到本地服务器功能
- PHP用swoole+websocket和redis实现web一对一聊天
- Yii框架布局文件的动态切换操作示例
- 关于laravel 子查询 & join的使用
- PHPUnit + Laravel单元测试常用技能
- php接口隔离原则实例分析
- laravel实现按月或天或小时统计mysql数据的方法
- laravel model模型处理之修改查询或修改字段时的类型格式案例
- 对laravel的session获取与存取方法详解
- php 中self,this的区别和操作方法实例分析
- Laravel使用原生sql语句并调用的方法
- Yii框架自定义数据库操作组件示例
- laravel 使用事件系统统计浏览量的实现
- PHP之多条件混合筛选功能的实现方法
- PHP多进程简单实例小结