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. linux命令讲解

    1.vi命令 1.光标移动到文件的最后一行 G     :$     ]] 2.光标移动到文件的第一行 :0     gg     [[ 3.从光标所在位置将光标移动到当前行的开头 0     ^   ...

  2. 第一次认识lambda匿名函数

    lambda 为了解决一些简单的需求而设计的"一句话"函数 语法 lambda 参数:返回值 1.可以多个参数,参数间用逗号隔开 2.匿名函数不管多复杂,只能写一行 3.返回值和正 ...

  3. stat.h头文件,轻松获取文件属性

    [以前还为了获取文件的长度,费劲从头读取一遍,一个一个字节的算. 做webserver时候,发现原来stat函数可以返回一个结构,里面包括文件的全部属性. 真是曲折啊.] #i nclude<s ...

  4. strak组件(10):批量操作

    效果图: 批量删除只是一个例子,可以根据需求定制自己想要的批量操作. 新增函数 def get_action_list(self) 钩子方法,获取要处理的批量操作的函数 def action_mult ...

  5. ln -s 软链接产生Too many levels of symbolic links错误

    不能使用相对路径, ln -s ./cmake /usr/bin/ 而是要 ln -s /usr/local/bin/cmake /usr/bin/

  6. CentOS网络设置 couldn't resolve host 'mirrorlist.centos.org问题解决

    在VMWare上安装好centos后,使用yum安装nodejs报错:can not resolve host 'mirritlist.centos.org', 百度上很多都说在/etc/resolv ...

  7. 洛谷P1605 迷宫

    迷宫 题目链接 这道题就是一道简单的dfs计方案数qwq. 我的思路是把表初始化为1,再将障碍改为0,因为在全局定义中数组会直接初始化为0,所以就少去了对边界的特判. next数组加循环可以减少代码量 ...

  8. 编译器错误消息: CS1617: 选项“6”对 /langversion 无效

    编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS1617: 选项“6”对 /langversion 无效:必须是 ...

  9. Windows 2003 IIS服务器配置环境(放.net开发的网站)

    配置IIS 安装.Net Framework3.5 安装SQL数据库 IIS的配置与安装步骤: 开始->管理工具->管理您的服务器->添加角色->(配置您的服务器向导)下一步- ...

  10. BInder浅析

    Binder是什么 Binder是运行在Android内核态用于进程间通信(IPC)的驱动,采用C/S架构,由三项基本组件组成:Binder服务端,Binder驱动,应用程序客户端. 为什么要用Bin ...