gym补题
图论
首先将有关系的图缩成一个点,然后有k个块,每一个块之间要么是爱,要么是恨,所以答案是\(2^{k-1}\)
如果搜索的时候有不存在的情形,直接记录下来,答案输出为0.
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #include <bits/stdc++.h> using namespace std; const int mod = 1e9+7; const int maxn = 1e6+10; typedef long long ll; vector<pair<int,int> > G[maxn]; int color[maxn]; int n, m; bool not_exist = false; bool vis[maxn]; ll pow_mod(ll a, ll b){ ll ans = 1; while(b){ if(b&1) ans = ans*a%mod; a = a*a%mod; b>>=1; } return ans; } bool dfs(int x, int c){ vis[x] = true; color[x] = c; for(int i=0; i<G[x].size(); i++){ int u = G[x][i].first; int r = G[x][i].second; int next_color = 3-c; if(r == 1) next_color = c; if(!vis[u]){ dfs(u, next_color); } if(color[u]!=next_color){ not_exist = true; } } } int main(){ ios::sync_with_stdio(false); int u, v, r; for(int i=0; i<maxn; i++) G[i].clear(); cin>>n>>m; for(int i=0; i<m; i++){ cin>>u>>v>>r; G[u].push_back(make_pair(v, r)); G[v].push_back(make_pair(u, r)); } memset(vis, 0, sizeof(vis)); int tot = 0; for(int i=1; i<=n; i++){ if(!vis[i]){ dfs(i, 1); tot++; } } if(not_exist){ printf("0\n"); } else{ printf("%I64d\n", pow_mod(2, tot-1)); } return 0; }
|
未解决的问题