标签:
Solution:
比较好的图论的题。
要做这一题,首先要分析love关系和hate关系中,love关系具有传递性。更关键的一点,hate关系是不能成奇环的。
看到没有奇环很自然想到二分图的特性。
那么当前的任务是先二分染色,判断给定的边是否有冲突,并且缩点。
假设缩完点后图中只身下k个点。这k个点的hate关系满足二分图的关系。
那么计算组合数,共2^(k-1)种方法。
#include <bits/stdc++.h> using namespace std; const int N = 100009; typedef pair<int, int> ii; int vis[N], n, m , flag , s; vector<ii> E[N]; void dfs (int x, int k) { vis[x] = k; --s; for (auto &i : E[x]) { if (!~vis[i.first]) { dfs (i.first, k ^ i.second); } else { if ( (vis[x]^vis[i.first]) != i.second) { flag = 1; return ; } } if (flag) return; } } int main() { memset (vis, -1, sizeof vis); ios::sync_with_stdio ( 0 ); cin >> n >> m; s = n; for ( int i = 1, u, v, c; i <= m; ++i ) { cin >> u >> v >> c; E[u].push_back (make_pair (v, c ^ 1) ); E[v].push_back (make_pair (u, c ^ 1) ); } for (int i = 1; i <= n; ++i) { if (!~vis[i] && !E[i].empty() ) { ++s; dfs (i, 1); } if (flag) { cout << 0 << endl; return 0; } } long long ans = 1, p = 2; --s; while ( s > 0 ) { if ( s & 1 ) ans = ans * p % 1000000007; p = ( p * p ) % 1000000007; s >>= 1; } cout << ans << endl; }
Codeforces 553C Love Triangles(图论)
标签:
原文地址:http://www.cnblogs.com/keam37/p/4606110.html