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. LVS+Keepalived-DR模式负载均衡高可用集群

    LVS+Keepalived DR模式负载均衡+高可用集群架构图 工作原理: Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能. VRRP,虚拟路由冗余协议,是针对路由器的 ...

  2. HTML+CSS : 笔记整理(2 常规流,BFC,固定定位,z-index)

    BFC和常规流的关系是什么:常规流遵循BFC,IFC规则. 定位规则总体来说三种: 常规流,浮动,绝对定位(CSS3里面新加了一种flex) 其中常规流包括BFC,IFC等规则,块级元素一个一排地从上 ...

  3. linux 共享内存

    共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输.这种高效带来的问题是,我们必须用其他手段来同步进程对共享内存的访问,否则会产生竞态条件.所以,共享内存通常和其他进程间通信方式一起使用 ...

  4. POJ:3977-Subset(双向搜索)

    Subset Time Limit: 30000MS Memory Limit: 65536K Total Submissions: 5961 Accepted: 1129 Description G ...

  5. DFS初级剪枝及心得

    关于DFS心得: 1.利用结构体,记录mark和题目要求的基本属性. 2.用到递归,使用递归时注意要设置出口,即符合要求时return,注意对递归的理解,对于不同情况可能要传递不同的参数,但出口都是一 ...

  6. [BZOJ1045] [HAOI2008] 糖果传递 (中位数)

    Description 题目链接 Solution 这题跟数列的中位数有关, 具体证明见刘汝佳的蓝皮书里 Code #include <cstdio> #include <algor ...

  7. Ubuntu 14.10 配置JDK + J2EE

    本文仅作为本人在Ubuntu 14.10下安装JDK + J2EE的一个记录: 安装JDK 从Oracle的官网下载jdk-7u75-linux-x64.tar.gz 将jdk-7u75-linux- ...

  8. 使用MD5比较两个文件是否相同

    MD5算法:是计算机广泛使用的一种哈希算法,将数据(如汉字)运算为另一固定长度值,用于确保信息传输完整一致.java,C++ 等多种编程语言都有MD5的实现,可直接使用. 文件MD5值:每个文件都可以 ...

  9. PowerCmd

    今天在手机上看慕课网,看到一个好玩的东西.Powercmd. 一开始的感觉是,妈的,我会cmd命令,为什么要用你的cmd? 后来,用了之后,感觉,嗯,还是Powercmd好用.功能强大. 我们来看看它 ...

  10. 利用split方法计算字符串中出现字母最多的次数

    最近练习一些简单的算法题,知道自己很不聪明,但却没想到用了这么久,划算不划算是个需要考虑的问题, 其中有个算法是:统计一个字符串出现最多的字母,网上很多自己的见解,但是才疏学浅,有些地方看的有点困难, ...