Time Limit: 20 Sec
Memory Limit: 256 MB
http://codeforces.com/contest/553/problem/C
Input
The first line of input will contain two integers n, m (3 ≤ n ≤ 100 000, 0 ≤ m ≤ 100 000).
The next m lines will contain the description of the known relationships. The i-th line will contain three integers ai, bi, ci. If ci is 1, then ai and bi are in love, otherwise, they hate each other (1 ≤ ai, bi ≤ n, ai ≠ bi, ).
Each pair of people will be described no more than once.
Output
Print a single integer equal to the number of ways to fill in the remaining pairs so that you are happy with every triangle modulo 1 000 000 007.
Sample Input
4 4
1 2 1
2 3 1
3 4 0
4 1 0
Sample Output
1
题意
给你一个无向图,然后要求让你添上边变成完全图,要求任意3元环都不是三角恋关系,或者没人相爱
然后问你方案数
题解:
考虑1号点连出去的所有边,有n-1条,事实上,这n-1条的颜色,就决定了整个图形的颜色。
原因在于,我们先假设两个人相爱,就涂红边,否则涂蓝边。
从n-1条中拿出两条(1, x)和(1, y),那么如果(1, x)和(1, y)都是红色,或者都是蓝色,那么(x, y) 一定是红色。
否则(x, y)就是蓝色。
那么给出任意一条边的信息(x, y)的颜色,就决定了(1, x) 和 (1, y) 是同色还是异色。那么就转化成这样一个问题,有n-1个点的无向图,要把点染成黑白色,给出部分点对是同色还是异色,求方案数
那么基本就是个简单的dfs了
代码
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 2000001 #define mod 1000000007 #define eps 1e-9 int Num; char CH[20]; const int inf=0x3f3f3f3f; inline ll read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } //************************************************************************************** vector< pair<int,int> > e[maxn]; int vis[maxn]; int ans; void dfs(int x) { for(int i=0;i<e[x].size();i++) { int v=e[x][i].first; int t=e[x][i].second; if(vis[v]==-1) { if(t==1) vis[v]=vis[x]; else vis[v]=1-vis[x]; dfs(v); } if(t==1) { if(vis[v]!=vis[x]) ans=0; } else { if(vis[v]==vis[x]) ans=0; } } } int main() { int n=read(),m=read(); for(int i=0;i<m;i++) { int a=read(),b=read(),c=read(); e[a].push_back(make_pair(b,c)); e[b].push_back(make_pair(a,c)); } ans=(mod+1)/2; memset(vis,-1,sizeof(vis)); for(int i=1;i<=n;i++) { if(vis[i]==-1) { ans=(ans+ans)%mod; vis[i]=0; dfs(i); } } cout<<ans<<endl; }