codeforces #309 div1 C
首先我们会发现所有的人构成了一个图
定义相爱为 在一个集合里
定义相恨为 不在一个集合里
很容易发现满足条件的图一定是一个二分图
那么分类讨论如下:
1、如果出现不合法 答案为0
2、如果不是一个二分图 答案为0
3、设图中联通块有k个,那么答案为2^k/2! = 2^(k-1)
那么算法很明了了
将相爱的人用并查集缩点并判断不合法
之后相恨的人之间相互连边并进行二分图染色判定
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std; typedef long long LL;
const int maxn=100010;
const int mod=1e9+7;
int n,m;
int co[maxn];
struct Edge{
int u,v,type;
}c[maxn];
int h[maxn],cnt=0;
int fa[maxn];
struct edge{
int to,next;
}G[maxn<<2]; int ufs(int x){return fa[x]==x?x:fa[x]=ufs(fa[x]);}
void add(int x,int y){++cnt;G[cnt].to=y;G[cnt].next=h[x];h[x]=cnt;}
LL pow_mod(LL v,int p){
LL tmp=1;
while(p){
if(p&1)tmp=tmp*v%mod;
v=v*v%mod;p>>=1;
}return tmp;
}
bool paint(int u){
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(co[v]){
if(co[v]==co[u])return false;
}else{
co[v]=3-co[u];
if(!paint(v))return false;
}
}return true;
}
int Get_color(){
int ans=0;
for(int i=1;i<=n;++i){
if(ufs(i)!=i)continue;
if(co[i])continue;
ans++;co[i]=1;
if(!paint(i))return -1;
}return ans;
} int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)scanf("%d%d%d",&c[i].u,&c[i].v,&c[i].type);
for(int i=1;i<=n;++i)fa[i]=i;
for(int i=1;i<=m;++i){
if(c[i].type){
int d1=ufs(c[i].u),d2=ufs(c[i].v);
if(d1!=d2)fa[d1]=d2;
}
}
for(int i=1;i<=m;++i){
if(!c[i].type){
int d1=ufs(c[i].u),d2=ufs(c[i].v);
if(d1==d2){printf("0\n");return 0;}
add(d1,d2);add(d2,d1);
}
}
int k=Get_color();
if(k==-1)printf("0\n");
else printf("%I64d\n",pow_mod(2LL,k-1));
return 0;
}
codeforces #309 div1 C的更多相关文章
- codeforces #309 div1 D
求最小值最大显然是要二分 二分之后转换成了判定性问题 我们考虑哪些点一定不能选 显然是将所有可选点选中之后依然不满足条件的点不能选 那么我们不妨维护一个堆,每次取出堆顶看看是否满足条件 不满足条件就p ...
- codeforces #309 div1 B
题目啰里啰嗦说了一大堆(耐心读完题目就可以秒题了) 首先我们考虑当前置换的开头的循环节的开头 1.如果是1 1->1形成循环节 问题变成i-1的子问题 2.如果是2 1->2->1形 ...
- codeforces #309 div1 A
先说我的解法吧 首先设f(i,j)表示选了前i个球且j种颜色都已经选完了的方案数 这显然是可以随便转移的 #include<cstdio> #include<cstring> ...
- codeforces 407 div1 B题(Weird journey)
codeforces 407 div1 B题(Weird journey) 传送门 题意: 给出一张图,n个点m条路径,一条好的路径定义为只有2条路径经过1次,m-2条路径经过2次,图中存在自环.问满 ...
- codeforces 407 div1 A题(Functions again)
codeforces 407 div1 A题(Functions again) Something happened in Uzhlyandia again... There are riots on ...
- codeforces #305 div1 done
总算搞定了这一场比赛的题目,感觉收获蛮大 其中A,B,C都能通过自己的思考解决掉 D题思路好神,E题仔细想想也能想出来 以后坚持每两天或者一天做一场CF的div1的全套题目 除非有实在无法做出来的题目 ...
- codeforces #309 DIV2
这场并没有做,做的赛后的,太晚了时间,中午做了两题,稍微贴一下,剩余的题目本周争取补完 A题: 链接:http://codeforces.com/contest/554/problem/A #incl ...
- Codeforces #254 div1 B. DZY Loves FFT 暴力乱搞
B. DZY Loves FFT 题目连接: http://codeforces.com/contest/444/problem/B Description DZY loves Fast Fourie ...
- codeforces #313 div1 E
首先我们要注意到一个事情 如果一个灯塔向左覆盖,那么比他小的某个灯塔如果向左覆盖的端点大于当前塔向左覆盖的端点,他一定向右覆盖 对于当前灯塔向右覆盖也是同理 那么我们只需要记录当前覆盖到的端点就可以完 ...
随机推荐
- FreeMarker语法
向原作者致敬,原文地址http://www.cnblogs.com/linjiqin/p/3388298.html FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化 ...
- OC2-重写
// // Dog.h // OC2-重写 // // Created by qianfeng on 15/6/17. // Copyright (c) 2015年 qianfeng. All rig ...
- javascript笔记—— call 简单理解
call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, [,.argN ...
- 打包并发布自己的Android应用(eclipse)
第一步,在Eclipse中选择需要打包的项目,然后右键--选择Export,会弹出一个打包的提示框,如下图所示. 按Next之后,会继续出现一个提示框,这里你可以选择自己需要打包的项目(默认是刚才选中 ...
- @Autowired与@Resource用法
官方文档中有这样一段话. If you intend to express annotation-driven injection by name, do not primarily use @Aut ...
- C++对象的JSON序列化与反序列化探索完结-列表的序列化与反序列化
在前两篇文章中,我们已经完成对普通对象以及复杂对象嵌套的序列化与反序列化,见如下地址: C++对象的JSON序列化与反序列化探索 C++对象的JSON序列化与反序列化探索续-复杂对象的序列化与反序列化 ...
- windows同时安装两个jdk
两个项目需求不同,需要不同的jdk(1.7,1.8),所以每次切换项目的时候就会重新卸载原有的,在安装新的,比较麻烦. 就查资料看可以同时安装多个jdk,但是每次只能配置一个环境变量.安装的时候还是遇 ...
- WMB代理无法正常启动时的解决方案。
情况:执行了启动命令,查看状态的时候 还是停止..再启动,又说已经启动了.. 解决方案:正常情况在hosts文件加一条记录:主机IP和hostname的映射关系就好了
- 连接Oracle数据库的OracleHelper.cs
using System; using System.Configuration; using System.Data; using System.Data.OracleClient; using S ...
- PHP随机生成广告图片的实例 代码
PHP随机生成广告图片: <?php /* +------------------------------------------------------------------+ | Mi ...