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(生成树)的更多相关文章

  1. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

  2. AtCoder Regular Contest 083 E - Bichrome Tree

    题目传送门:https://arc083.contest.atcoder.jp/tasks/arc083_c 题目大意: 给定一棵树,你可以给这些点任意黑白染色,并且赋上权值,现给定一个序列\(X_i ...

  3. Atcoder Regular Contest 093 D - Dark Horse(组合数学+状压 dp)

    Atcoder 题面传送门 & 洛谷题面传送门 常规题,简单写写罢((( 首先 \(1\) 的位置是什么不重要,我们不妨钦定 \(1\) 号选手最初就处在 \(1\) 号位置,最后答案乘个 \ ...

  4. AtCoder Regular Contest 095

    AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...

  5. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  6. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  7. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  8. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

  9. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

随机推荐

  1. Servlet学习笔记04——什么是重定向,servlet生命周期?

    1.重定向 (1)什么是重定向? 服务器通知浏览器访问一个新的地址. 注: 服务器可以通过发送一个302状态码及一个 Location消息头(该消息头的值是一个地址,一般 称之为重定向地址)给浏览器, ...

  2. JS获取元素属性和自定义属性

    获取元素的属性分为两种类型: 1-获取元素常见的属性(class,id,type,value……) 2-获取自定义的元素的属性(data-value,data-mess…….) 获取元素的属性,设置元 ...

  3. java基础不牢固容易踩的坑

    java基础不牢固容易踩的坑 经过一年java后端代码以及对jdk源码阅读之后的总结,对java中一些基础中的容易忽略的东西写下来,给偏爱技术热爱开源的Coder们分享一下,避免在写代码中误入雷区. ...

  4. php性能优化 --- laravel 性能优化

    1.laravel官方提供了一些优化(laravel 5.* 版本): (1).关闭debug,修改 .env 的  APP_DEBUG=false    (2).  sudo php artisan ...

  5. 《Python语言及其应用》学习笔记

    第二章 ========== 对象的类型决定了可以对它进行的操作.对象的类型还决定了它装着的数据是允许被修改的变量(可变的),还是不可被修改的常量(不可变的). Python是强类型的,你永远无法修改 ...

  6. CSS选取指定位置标签first-child、last-child、nth-child

    1.first-child 选择列表中的第一个标签. 2.last-child 选择列表中的最后一个标签 3.nth-child(n) 选择列表中的第n个标签 4.nth-child(2n) 选择列表 ...

  7. sigaction函数

    sigaction函数是设置信号处理的接口.比signal函数更健壮 #include <signal.h> int sigaction(int signum, const struct ...

  8. L2-029 特立独行的幸福 (25 分)

    L2-029 特立独行的幸福 (25 分)   对一个十进制数的各位数字做一次平方和,称作一次迭代.如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数.1 是一个幸福数.此外,例如 19 经过 ...

  9. 关于原生JS获取class,ID等属性的一些封装

    一.传统上获取是通过document.getElementById获取元素的ID属性,通过总结与学习总结一下获取元素class以及id属性的一些封装; 1.创建构造函数,这里面不需要多解释什么:(主要 ...

  10. USACO Section1.3 Wormholes 解题报告

    wormhole解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------- ...