AtCoder Regular Contest 093 E: Bichrome Spanning Tree(生成树)
Bichrome Spanning Tree
题意:
给出一个n个点,m条边的无向连通图,现在要给每条边染色,可以染成黑色或者白色。
现在要求在染色完毕后,找出一个至少包含一条黑边和一条白边的最小生成树,使其权值和为X。
问这样的染色方案有多少个?
题解:
题目要求找出一个至少包含一条黑边和白边的最小生成树,那么可能就会存在这种情况:原图的最小生成树所有边都为同色,那这不是我们要求的;我们这时就会去掉一条权值最大的边,再添一条边进来。
那么我们就可以算出包含指定边的最小生成树,方法就是先加我们指定的边,然后从小到大加边。
现在来解决这个问题,我们可以先求出原图的最小生成树,设其权值和为T,那么我们就对接下来的几种情况进行分析:
1.T>X 这种情况方案数为0;
2.T=X 这种情况下,因为边权可能会相等,所以可以继续进行删边加边的操作,直至第一种情况;
3.T<X 这种情况,我们就继续删边加边,找出使T=X相等的边的个数。
最后根据找到边的个数统计一下就好了:
对于第二种情况,设使T=X的边个数为a,其余边为b,那么答案就是(2^a-2)*2^b;
对于第三种情况,一开始使T<X的边只能同色,则方案数为2,则总答案为(2*2^a-2)*2^b,(a,b含义与上相同)。
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ,MOD = 1e9+;
int n,m;
ll X;
struct Edge{
int u,v,w;
bool operator < (const Edge& A)const{
return w<A.w;
}
}e[N];
int f[N];
int find(int x){
return f[x]==x ? x :f[x]=find(f[x]);
}
ll Kruskal(int edge){
ll sum = ;
for(int i=;i<=n+;i++) f[i]=i;
int fx,fy;
if(edge){
fx=find(e[edge].u),fy=find(e[edge].v);
f[fx]=fy;sum+=e[edge].w;
}
for(int i=;i<=m;i++){
if(i==edge) continue ;
fx=find(e[i].u);fy=find(e[i].v);
if(fx!=fy){
f[fx]=fy;
sum+=e[i].w;
}
}
return sum;
}
ll qp(ll a,ll b){
ll ans=;
while(b){
if(b&) ans=a*ans%MOD;
a=a*a%MOD;
b>>=;
}
return ans ;
}
int main(){
scanf("%d%d%lld",&n,&m,&X);
for(int i=;i<=m;i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
sort(e+,e+m+);
ll t = Kruskal();
if(t>X){cout<<;return ;}
int cnt1=,cnt2=;
for(int i=;i<=m;i++){
ll now = Kruskal(i);
if(now==X) cnt1++;
else if(now>X) cnt2++;
}
if(t==X) cout<<(qp(,cnt1)-)*qp(,cnt2)%MOD;
else cout<<((ll)*qp(,cnt1)-)%MOD*qp(,cnt2)%MOD;
return ;
}
AtCoder Regular Contest 093 E: Bichrome Spanning Tree(生成树)的更多相关文章
- AtCoder Regular Contest 093
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...
- AtCoder Regular Contest 083 E - Bichrome Tree
题目传送门:https://arc083.contest.atcoder.jp/tasks/arc083_c 题目大意: 给定一棵树,你可以给这些点任意黑白染色,并且赋上权值,现给定一个序列\(X_i ...
- Atcoder Regular Contest 093 D - Dark Horse(组合数学+状压 dp)
Atcoder 题面传送门 & 洛谷题面传送门 常规题,简单写写罢((( 首先 \(1\) 的位置是什么不重要,我们不妨钦定 \(1\) 号选手最初就处在 \(1\) 号位置,最后答案乘个 \ ...
- AtCoder Regular Contest 095
AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- AtCoder Regular Contest 094
AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...
- AtCoder Regular Contest 102
AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...
随机推荐
- VMware中Ubuntu开机时停在启动界面,不进入X-window的解决办法
启动Ubuntu虚拟机时,停在这个画面不动: 试了若干次,都是这样.尝试了新建一个虚拟机然后把.vmdk文件拷过去启动,无法解决. 尝试重启,在这个界面按esc进入grub: 选择恢复模式 recov ...
- linux shell 部分问题解决方法
1. 判断shell里判断字符串是否包含某个字符 a. 可以用正则式匹配符号 “=~” 举例:str="this is a string" 要想在判断str中是否含有 ...
- GNU汇编 伪指令
伪指令 本身并没有所对应的机器码 它只是在编译的时候起作用,或者转换为其他的实际指令来运行 global ascii byte word data equ align @ 下面的例子是在数据段存放数据 ...
- Java web--过滤器
本文引自:https://www.cnblogs.com/dudududu/p/8505177.html 参考博客:http://www.cnblogs.com/coderland/p/5902878 ...
- Java执行存储过程
1.JDBC调用存储过程: CallableStatement /** *p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替 *其余地方写法固定 */ CallableStateme ...
- 获取父窗口元素或者获取iframe中的元素(相同域名下)
jquery方法 在父窗口中获取iframe中的元素 //方法1 $("#iframe的ID").contents().find("iframe中的元素"); ...
- nginx配置安装
先安装pcrepcre作用是让Nginx支持Rewrite功能下载地址:https://sourceforge.net/projects/pcre/files/pcre/,选择最新版本进行下载下载之后 ...
- Oozie wordcount实战
一.定义 基本概念 Action: An execution/computation task (Map-Reduce job, Pig job, a shell command). It can a ...
- DbVisualizer 解决中文乱码问题
在SQL Commander中,sql语句中如果有中文,显示是‘口口口’. 解决办法如下: 在Tools->tool Properties->General->Appearance- ...
- equals和toString
Object的equals方法默认比较地址值.所以当需要比较两个对象的内容时需要重写equals方法.