程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Codeforces 91C Ski Base 加邊求歐拉回路數量

Codeforces 91C Ski Base 加邊求歐拉回路數量

編輯:關於C++

 

題意:

給出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 to 1. If we connect vertexes in the same connected components then the result should be multiplied by 2 else 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 incidence I, rows in it will be edges and columns will be vertexes. Let's define xor of two rows. Xor of two rows a и b will be row c such that ci = ai xor bi. Notice if xor of 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 with xor operation, we will xor the 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 to 2k = 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 vertexes a and b (aand b are the ends of the adding edge).


 

 

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
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
, ans-1);
		}
	}
	return 0;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved