Codeforces 91C Ski Base 加边求欧拉回路数量

题目链接:点击打开链接

题意:

给出n个点m条无向边的图

开始图里没有边,,每次加一条边,然后输出图里欧拉回路的条数。

思路:

We will count the number of ski bases including the base consisted of empty subset of edges (before printing just subtract one). In the beginning the number of bases is equal to1. If we connect vertexes in the same connected components then the result should be multiplied by2else do nothing. You should use DJS data structure to know information about connected components where vertexes are and to unite them.Why is it correct?To prove it we will use the matrix of incidenceI, rows in it will be edges and columns will be vertexes. Let’s definexorof two rows.Xorof two rowsaиbwill be rowcsuch thatci=aixorbi. Notice if xorof some subset of rows is equal to a zero row then this subset form the ski base. It’s correct because, the degree of contiguity of every vertex is even, so we can form an Euler cycle in every connected component. The answer is 2(m-rank(I)).Why it is correct? Let’s write the number of edge from the right of each row which suit this row. While finding the matrix rank using gauss method withxoroperation, we willxorthe subsets from the right of the strings. In the end the subsets of edges written from the right of the zero rows will form the basis of the linear space. Thats why we can take any subset of vectors from basis and make up a new ski base. The number of these subsets is equal to2k=2(m-rank(I)), where k is the number of zero rows.

The last thing we should notice that the adding row is liner depended if and only if there is exist a way between the vertexesaandb(aandbare the ends of the adding edge).

#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <algorithm>#include <iostream>#include <set>using namespace std;const int N = 100100; const int mod = 1000000009;int f[N];int find(int x){ return x == f[x] ? x : f[x] = find(f[x]); }bool Union(int x, int y){int fx = find(x), fy = find(y);if (fx == fy)return false;if (fx > fy)swap(fx, fy);f[fx] = fy;return true;}int n, m;int main(){while (cin >> n >> m){for (int i = 1; i <= n; i++)f[i] = i;int ans = 1;while (m–){int u, v; scanf("%d %d", &u, &v);if (Union(u, v)==false)ans = (ans + ans) % mod;printf("%d\n", ans-1);}}return 0;}

答:他是憋死的,因为沙漠里没有电线杆撒尿。问:

Codeforces 91C Ski Base 加边求欧拉回路数量

相关文章:

你感兴趣的文章:

标签云: