YbtOJ-连通的图【结论,线性基】
正题
题目大意
给出nnn个点n+k−1n+k-1n+k−1条边的一张图,求有多少种删除若干条边的方案使得图依旧联通。
1≤n≤105,1≤k≤101\leq n\leq 10^5,1\leq k\leq 101≤n≤105,1≤k≤10
解题思路
注意到kkk很小,我们考虑先搞出一棵dfsdfsdfs树然后剩下的做非树边。
这里有个结论是,我们将第iii条非树边权值定为2i2^i2i,树边权值定义为覆盖了它的非树边的权值的异或和,那么删除边集SSS后图不连通的充要条件就是存在一个子集异或和为000。
感性理解一下,如果一个边集异或和为000,显然边集内肯定有树边,考虑一条非树边(如果没有显然是会被分割的),它如果跨过偶数条被删的边那么中间如果有被删除的树边就会被分割出中间的连通块,如果它跨过奇数条被删除的树边那么显然它也要被删除,无法连接两个连通块。
然后考虑一张被删除后不连通的图,我们将边集中连接原本两个连通块的边拿出来,如果只有树边显然这个树边的权值为000,如果有非树边,那么中间被删除的树边也会异或上这个权值,所以异或和还是为000。
这样充分性和必要性就证明完了。
至于做法我们得到所有边的权值,那么显然权值种类不会超过3k3k3k种,我们直接爆搜每种权值选不选用线性基求解就好了。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=1e5+10;
const int P=998244353;
struct node{int to,next,w ;
}a[N<<1];
int n,k,tot,m,ls[N],dep[N],c[N],w[N],ans,d[90];
bool v[N];
vector<pair<int,int> >f;
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(int x,int fa){v[x]=1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(i==(fa^1)||a[i].w)continue;if(v[y]){a[i].w=a[i^1].w=1;w[x]^=(1<<m);w[y]^=(1<<m);c[1<<m]++;m++;}else dfs(y,i);}return;
}
void build(int x,int fa){for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa||a[i].w)continue;build(y,x);w[x]^=w[y];}if(fa)c[w[x]]++;return;
}
void calc(int dep,int r){if(dep==f.size()){(ans+=r)%=P;return;}int x=f[dep].first,p=-1;calc(dep+1,r);for(int i=m-1;i>=0;i--)if((x>>i)&1){if(d[i])x^=d[i];else {p=i;break;} }if(x){d[p]=x;calc(dep+1,1ll*r*f[dep].second%P);d[p]=0;}
}
int main()
{freopen("connected.in","r",stdin);freopen("connected.out","w",stdout);scanf("%d%d",&n,&k);tot=1;for(int i=1;i<n+k;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);} dfs(1,0);build(1,0);for(int i=1;i<(1<<m);i++)if(c[i])f.push_back(mp(i,c[i]));calc(0,1);printf("%d\n",ans);return 0;
}
YbtOJ-连通的图【结论,线性基】相关推荐
- YbtOJ#883-最大的割【带修线性基】
正题 题目链接:http://www.ybtoj.com.cn/contest/118/problem/3 解题思路 给出nnn个点,mmm次动态插入一条无向边询问:割掉一些边使得图中至少两点不连通, ...
- 【BZOJ 4671】异或图 【斯特林反演】【线性基】【贝尔数复杂度】
传送门 题意:定义两个图的异或的边集为在两张图中恰出现一次的边.给sss张nnn个点的图的集合,求异或和为连通图的子集数. s≤60,n≤10s \leq 60,n \leq 10s≤60,n≤10 ...
- 【BZOJ3569】DZY Loves Chinese II(线性基,图的连通性)
Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...
- YBTOJ洛谷P4869:出现位置(线性基)
解析 关键结论: 若 nnn 个数组成的线性基大小为 SSS,则其子集异或组成的结果有 2S2^S2S 种,且每种结果都有 2n−S2^{n-S}2n−S 种方案. 证明:考虑 n−Sn-Sn−S 个 ...
- YBTOJ洛谷P3292:幸运数字(线性基、点分治/倍增)
解析 虽然使用三个log的倍增算法艹过去了 但是我们还是来聊聊正解吧 考虑点分治 对于当前的根,dfs求出联通块内每个点到当前根的线性基 一条路径的答案应该在路径出现上第一个成为根的点时统计到 具体来 ...
- 【HDU3949 + BZOJ2115 + CF724G】【异或线性基例题】| 倍增 | 第k小异或和 | DFS处理环 |【CGWR】| N
三道关于异或线性基的有趣的题目 [1] HDU 3949. XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...
- 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横
不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...
- Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS
G. Xor-matic Number of the Graph http://codeforces.com/problemset/problem/724/G 题意:给你一张无向图.定义一个无序三元组 ...
- 【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS
[BZOJ2115][Wc2011] Xor Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ...
最新文章
- Mozilla发布2015年度报告:搜索合作成营收大头
- oracle10g密钥,Oracle10G透明数据加密技术如何使用呢?
- 远程服务器登入信息,远程登录服务器查看信息
- MUI+Htmlplus开发APP实现页面之间传值
- vue 同步加载_vue axios同步请求解决方案
- C/C++ 笔试、面试题目大汇总收藏(上)
- 记录MS VisualStudio添加注释宏代码写法
- 浅谈数据迁移测试(转载)
- 压缩包修改所属目录Linux,linux文件/目录/压缩解压 操作指令
- 什么是溢出?补码加法运算如何判断是否溢出?
- python好学吗一般要学多久-Python好学吗?精通Python需要多长时间?
- Photoshop文字之——制作写在宣纸上的水彩字特效
- 以太网帧格式 IP数据报格式 TCP数据报格式 MTU MSS
- python实现多重排序(多级排序)
- Code Review 在丁香医生前端团队的实践
- 关于《推背图》,《奇门遁甲》
- Python 函数 | filter 函数详解
- 深入探索正交投影变换
- ANU COMP2310(2019) Assignment 1
- Lex Yacc (一) 入门
热门文章
- mysql列增减_Mysql基本操作——增减改查
- 用matlab算24点小游戏,24点游戏的Matlab程序
- java将图片铺满panel_如何让添加的背景图片铺满整个JFrame?
- python实用脚本 知乎_停课不停学|38 个免费 Python 项目合集,从小白到老司机!...
- netcore读取json文件_【NET Core】.NET Core中读取json配置文件
- mysql os.pid_MySQL在OS El Capitan的配置[PID file error]
- java实用教程——组件及事件处理——ActionEvent事件
- 7-34 任务调度的合理性 (25 分)(思路加详解+兄弟们冲呀)
- [Nginx]负载均衡和动静分离
- Java实现栈(顺序栈,链栈)