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 ;
}

最新文章

  1. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap
  2. jQuery控件有所感悟
  3. 4.13-4.17c语言学习
  4. js快速打印一个五分制(五颗星)的评分情况
  5. MySQL在Linux系统下配置文件详解
  6. c语言 int (*p)[5] 类型分析
  7. php工作两年了。。。
  8. 1. Apache ZooKeeper快速课程入门
  9. qt delete
  10. Python基础-python流程控制之循环结构(五)
  11. [国家集训队]middle 解题报告
  12. url字符长度限制解决办法
  13. 0000 - Spring MVC 原理以及helloworld
  14. python大法好——编码.文件
  15. 关于css中float的理解
  16. PAT甲题题解-1012. The Best Rank (25)-排序水题
  17. MySql初试
  18. [CF183D]T-shirt
  19. class对象存储
  20. HDU4681_String

热门文章

  1. Linux apt & yum 及 常用命令
  2. linux系统的启动过程简要分析
  3. python开发基础之字符编码、文件处理和函数基础
  4. [bzoj1552][Cerc2007]robotic sort&amp;&amp;[bzoj3506][Cqoi2014]排序机械臂
  5. android 获取图片
  6. 常用doc 命令
  7. cookie不能删除
  8. Eclipse 出现“polling news feeds”的解决办法
  9. Python程序执行时的不同电脑路径不同问题
  10. iOS CGContextRef 画一条直线,仅仅是画一条直线