1. 程式人生 > >杭電Problem1878 歐拉回路 並查集 + 歐拉回路

杭電Problem1878 歐拉回路 並查集 + 歐拉回路

問題地址

歐拉回路

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11814    Accepted Submission(s): 4348


Problem Description 歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定一個圖,問是否存在歐拉回路?
Input 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數N ( 1 < N < 1000 )和邊數M;隨後的M行對應M條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從1到N編號)。當N為0時輸入結
束。
Output 每個測試用例的輸出佔一行,若歐拉回路存在則輸出1,否則輸出0。

Sample Input 3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
Sample Output 1 0
Author ZJU 對於一個無向圖,其為歐拉回路的充要條件為其是連通圖,且頂點的度為偶數。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX_N 1005
#define MIN(a, b)	(a > b): a? b
using namespace std;
int par[MAX_N];
int d[MAX_N];
void init(int x)
{
	for (int i = 0; i <= x; i++) {
		par[i] = i;
		d[i] = 0;
	}
}
int find(int x)
{
	if (x == par[x])	return x;
	else	return find(par[x]);
}
void unite(int x, int y)
{
	int fx = find(x);
	int fy = find(y);
	if (fx != fy){
		par[fy] = fx;
	}
}
int main()
{
	int n, m, a, b;
	while (scanf("%d", &n) , n) {
		init(n);
		scanf("%d", &m);
		for (int i = 0; i < m; i++) {
			scanf("%d %d", &a, &b);
			unite(a, b);
			d[a]++;
			d[b]++;
		}
		int tree = 0;
		for (int i = 1; i <= n; i++) {
			if (i == par[i]) {
				tree++;
			}
		}
		if (tree != 1) {
			printf("0\n");
			continue;
		}
		for(int i = 1; i <= n; i++) 
        {
            if(d[i] % 2 != 0)
            {
                tree = 0;
                break;
            }
        }
        if(tree)
            printf("1\n");
        
        else
            printf("0\n");
	}
}



相關推薦

Problem1878 +

問題地址 歐拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11814    Accepted Su

HDU-3018-Ant Trip-+

for its tin bits ems log set https 回路 Ant Trip 這道題一開始覺得是並查集,穩了;wa 才想起來有兩個重要條件 1、完全獨立的點不算; 2、把點連起來的邊(路)不能重復走:就是要判斷歐拉回路,即每個點的度數是不是偶數; 遍歷每個

POJ-2513 Colored Sticks---++字典樹

lan [] 復雜 題意 沒有 fin pre else 解題思路 題目鏈接: https://vjudge.net/problem/POJ-2513 題目大意: 給一些木棍,兩端都有顏色,只有兩根對應的端點顏色相同才能相接,問能不能把它們接成一根木棍 解題思路: 題意不難

hdu-1116(+

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1116 思路:將字串的頭元素和尾元素視為圖的x,y節點,然後合併x,y。 如果這個圖不連通,則門不能開啟,如果路徑是歐拉回路或者尤拉通路,則門可以開啟。 #include<iostream>

HDU-1116-Play on Words ( +

原題連結: http://acm.hdu.edu.cn/showproblem.php?pid=1116 Some of the secret doors contain a very interesting word puzzle. The team of archaeologists

Ant Trip(+)

Ant Trip     題目描述 原題來自:2009 Multi-University Training Contest 12 - Host by FZU

poj 2513 +判斷是否聯通+Trie樹

http://poj.org/problem?id=2513 最初看到 第一感覺---map  一看250000的資料量 果斷放棄 然後記得以前看過,trie代替map,尤其當資料量特別大的時候 學到了: 1、Trie代替map的思想,可以在單詞結尾的tree[i][tk]

HDU:1878 +

1 0 題義就是在給定的圖中判定是否存在歐拉回路。 圖G的一個迴路,若它恰通過G中每條邊一次,則稱該回路為尤拉(Euler)迴路。 具有歐拉回路的圖稱為尤拉圖(簡稱E圖)。 這裡總結下各種圖的判定的方法: 1.無向圖中:所給定的圖為連通圖,且所有節點的度為偶數; 2.有向圖中:所給定的圖

LOJ-10108(+)一個圖至少用幾筆畫成

turn stream scanf spa iostream () memset int get 題目鏈接:傳送門 思路: 用並查集統計出每個區塊奇數個節點的個數x,每個區塊對筆畫的貢獻是max(x/2,1); 然後每個區塊求和即可。 #include<iostr

Play on words 之+解題報告

Play on Words Time Limit: 10000/5000 MS(Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3754    Accepted S

10129 Play on Words-----+尤!!!

題意:判斷所有字串是不是可以連在一起,實際上就是判斷所構造的有向圖是否存在歐拉回路或者尤拉圖; #include<iostream> #include<cstdio> #include<cmath> #include<cstri

輸出路徑(+佛羅來算法)

ace can tac merge amp mes 奇數 記錄 max #include<bits\stdc++.h> using namespace std; const int maxn=100; stack<int>s;/*輸出歐拉回

HDU 1116.Play on Words【+尤圖】【5月16】

Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7111    Accepte

2018多校第二場1003(DFS,

歐拉路 style ear bits its space nbsp 記錄 一個隊列 #include<bits/stdc++.h>using namespace std;int n,m;int x,y;int num,cnt;int degree[100007]

HDU 3018 Ant Trip (求連通塊數+)

http 道路 遇到 連通塊 ems ble define ant trip 註意 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3018 題目大意:有n個點,m條邊,人們希望走完所有的路,且每條道路只能走一遍。至少要將人們

hdu1878-

flag space 回路 ostream mes eof break != fine 純裸題。。寫著方便理解。。。 題意:判斷一個無向圖是否存在歐拉回路。。。 解題思路:並查集判斷一下是否聯通,然後再判斷一下點的度數是否為偶數就行了; #include<iostr

HDU-1878-

歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定一個圖,問是否存在歐拉回路? Input 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數N ( 1 < N < 1000 )和邊數M;隨後的M行對應M條邊,每行給出一對

Gym 101879C Promenade by the lake —— dfs+ 找構成需要新增的邊

The city of Porto will host the ICPC World Finals in 2019. One of the secret touristic spots in the city is the so-called “lake of

CodeForces 209C Trails and Glades(判斷+計算聯通分量)

題意:判斷能否構成歐拉回路,不能的話輸出最小需要新增多少條邊 題解:並查集處理出聯通分量,輸入時處理出奇度數點個數,結果即為  奇度數點個數/2+不含奇度數點的聯通分量個數,1節點自動算作一個聯通分量 不管是否有邊連線 #include <cstdio> #i

HDU1878

歐拉回路Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 16538    Accepted Submission(s