Codeforces 553C Love Triangles(图论)

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;

}
View Code

 

你可能感兴趣的:(codeforces)