思路

并查集的好题

考虑到求满足条件限制的方案数,显然观察样例可知结果就是2^x,x是互不影响的边的集合数量

然后考虑如何求互不影响的边的集合数量

可以使用并查集,用i和i+n表示这个点的父亲连向它的边的两种指向,然后每次合并,u->lca,v->lca,如果lca不是u或v,合并u+n和v,v+n和u即可

为了保证复杂度,需要路径压缩一下

但是要注意这样的话,合并u+n和v,v+n和u必须在后面进行,不然会破坏树的结构

最后答案是\(2^{x}\),x是并查集个数/2

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int v[600400],fir[300400],nxt[600400],cnt;
void addedge(int ui,int vi){
++cnt;
v[cnt]=vi;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
int jump[300400][20],dep[300400];
void dfs(int u,int f){
jump[u][0]=f;
dep[u]=dep[f]+1;
for(int i=1;i<20;i++)
jump[u][i]=jump[jump[u][i-1]][i-1];
for(int i=fir[u];i;i=nxt[i]){
if(v[i]==f)
continue;
dfs(v[i],u);
}
}
int lca(int x,int y){
if(dep[x]<dep[y])
swap(x,y);
for(int i=19;i>=0;i--)
if(dep[jump[x][i]]>=dep[y])
x=jump[x][i];
if(x==y)
return x;
for(int i=19;i>=0;i--)
if(jump[x][i]!=jump[y][i])
x=jump[x][i],y=jump[y][i];
return jump[x][0];
}
const int MOD = 1000000007;
int pow(int a,int b){
int ans=1;
while(b){
if(b&1)
ans=(1LL*ans*a)%MOD;
a=(1LL*a*a)%MOD;
b>>=1;
}
return ans;
}
int fa[600400],n,m;
int find(int x){
if(fa[x]==x)
return x;
else
return fa[x]=find(fa[x]);
}
void merge(int x,int Lca){
while(dep[jump[x][0]]>dep[Lca]){
int f=jump[x][0];
fa[find(x)]=find(f);
fa[find(x+n)]=find(f+n);
x=find(f);
}
}
int ta[300300],tb[300300],Lca[300300];
int main(){
freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=1;i<=2*n;i++)
fa[i]=i;
for(int i=1;i<n;i++){
int a,b;
scanf("%d %d",&a,&b);
addedge(a,b);
addedge(b,a);
}
dfs(1,0);
for(int i=1;i<=m;i++){
scanf("%d %d",&ta[i],&tb[i]);
Lca[i]=lca(ta[i],tb[i]);
merge(ta[i],Lca[i]);
merge(tb[i],Lca[i]);
}
for(int i=1;i<=m;i++){
if(Lca[i]!=ta[i]&&Lca[i]!=tb[i]){
fa[find(ta[i]+n)]=find(tb[i]);
fa[find(tb[i]+n)]=find(ta[i]);
}
}
int ans=0;
for(int i=2;i<=n;i++){
if(find(i)==find(i+n)){
printf("0\n");
return 0;
}
ans+=(find(i)==i);
ans+=(find(i+n)==(i+n));
}
printf("%d\n",pow(2,ans/2));
return 0;
}

p4434 [COCI2017-2018#2] ​​Usmjeri的更多相关文章

  1. COCI2017/2018 CONTEST #7

    Prosjek 显然,越大的数应该越后参与平均数的计算,这样受较小数的影响就小一些 那我们就排个序,贪心的从最小的数开始往大的计算平均数即可 时间复杂度\(O(nlogn)\) Timovi 把分组分 ...

  2. Usmjeri(COCI2017.2)题解

    题意 给一棵N个节点的树,编号从1到N,再给定m对点(u,v),你要将树上的每条无向边变为有向边,使得给定的点对都满足u能到达v或v能到达u.问有多少种不同的方案,答案对(1e9+7)求余. 1 ≤ ...

  3. 2018. The Debut Album

    http://acm.timus.ru/problem.aspx?space=1&num=2018 真心爱过,怎么能彻底忘掉 题目大意: 长度为n的串,由1和2组成,连续的1不能超过a个,连续 ...

  4. Math.abs(~2018),掌握规律即可!

    Math.abs(~2018) 某前端群的入门问题长姿势了,一个简单的入门问题却引发了我的思考,深深的体会到自己在学习前端技术的同时忽略遗忘了一些计算机的基础知识. 对于 JS Math对象没什么可说 ...

  5. 肖秀荣8套卷2018pdf下载|2018肖秀荣冲刺8套卷pdf下载电子版

    肖秀荣8套卷2018pdf下载|2018肖秀荣冲刺8套卷pdf下载电子版 下载链接: https://u253469.ctfile.com/fs/253469-229815828

  6. 2018年的UX设计师薪酬预测,你能拿多少?

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具.   一个经验丰富的设计师完全可以根据地区和专业来可以预期薪酬之间的差距,其中悬殊最高可达80K. 本 ...

  7. Hello 2018, Bye 2017

    2017年过去了,过去一年经历了太多,改变了好多好多,可以说人生进入了另一个阶段,有可能是成熟吧. 回顾2017 去年换了新工作,离开了将近工作了8年的公司,不带走一丝云彩,为其任劳任怨,最后没有任何 ...

  8. New Life With 2018

    2017年转眼过去了.对自己来说.这一大年是迷茫和认知的一年.我的第一篇博客就这样记录下自己的历程吧 一:选择 从进入这一行到现在已经一年多了,2016年11月份就像所有的应届毕业生一样,都贼反感毕业 ...

  9. 2017 年终总结 & 2018 年度计划

    不立几个 Flag,都不知道怎么作死 2017 年度计划完成情况: 1.健身时间不少于350天:  未完成 中断了22天,实际运动 343天   2.至少每个月看一本书:  及格 <切尔诺贝利的 ...

随机推荐

  1. Hadoop 单节点(或集群)基本配置信息

    1. 默认配置文件: 存放于Hadoop对应的jar包中 core-default.xml hdfs-default.xml yarn-default.xml mapred-default.xml 2 ...

  2. poj1961(kmp算法next数组应用)

    题目链接:https://vjudge.net/problem/POJ-1961 题意:给定一个长为n的字符串(n<=1e6),对于下标i(2<=i<=n),如果子串s(1...i) ...

  3. [转帖]「知乎知识库」— 5G

    「知乎知识库」— 5G 甜草莓 https://zhuanlan.zhihu.com/p/55998832 ​ 通信 话题的优秀回答者 已关注 881 人赞同了该文章 谢 知识库 邀请~本文章是几个答 ...

  4. cmd寻找tomcat的命令和删除进程的命令

    netstat -ano | findstr 8080taskkill -f -pid 端口 idea 异常关闭,无法启动Tomcat提示Error running ‘server_web’: Una ...

  5. PowerShell 反弹渗透技巧

    Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能,并且与现有的WSH保持向后兼容,因此它的脚本程序不仅能访 ...

  6. poj 1224

    题意:有一个5 * 6的矩阵,每个位置表示灯,1表示灯亮,0表示灯灭. 然后如果选定位置i,j点击,则位置i,j和其上下左右的灯的状态都会反转. 现在要你求出一个5 * 6的矩阵,1表示这个灯被点击过 ...

  7. js Indexof的用法

    JavaScript中indexOf()函数 JavaScript中indexOf()函数方法返回一个整数值,指出  String 对象内子字符串的开始位置.如果没有找到子字符串,则返回 -1.如果 ...

  8. iOS 定义多个参数函数的写法

    多个参数的写法 (方法的数据类型)函数名:(参数1数据类型)参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 …. ; 如  :  有三个参数 -(void)getdetailI ...

  9. arcgis js之卷帘工具

    arcgis js之卷帘工具 效果图: 代码: var swipe = new Swipe({ view: view, leadingLayers: [layer1, layer2], trailin ...

  10. C++ STL 之 函数对象

    重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用.注意 ...