1. 程式人生 > >歐拉回路的判斷

歐拉回路的判斷

基礎概念

首先來看一下離散數學中的一些基礎概念:
通路:在無向圖中由點邊交替組成的序列就是通路(如果這個圖是簡單的,那麼也可以使用點的序列來表示),如果首尾的點相同,則稱為一條迴路
無向圖的連通性:無向圖中任意一對點之間均有通路
尤拉通路:從某個頂點出發,將所有的邊遍歷一遍並且僅經過一遍的通路序列稱為尤拉通路,連通的多重圖有歐拉回路而無歐拉回路當且僅當它恰有兩個奇數度頂點
這裡說明了尤拉通路的條件:

  • 圖是連通的,沒有孤立節點
  • 對於無向圖來說,奇數度的頂點為2個,這兩個頂點分別是起點以及終點(0個的話就是迴路了)

歐拉回路:如果尤拉通路的起點與終點一樣,則成為歐拉回路, 連通的多重圖具有歐拉回路當且僅當它的每個頂點都有偶數度
則歐拉回路的條件:

  • 圖是連通的,沒有孤立節點
  • 無向圖的每個節點的度數都是偶數度,有向圖每個節點的入度等於出度

判斷圖是否存在歐拉回路

根據判斷的條件,首先是判斷圖的連通性,然後判斷圖的每個節點的度數是否是偶數就可以了:

例如,這個題目:

輸入描述:

測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數N ( 1 < N < 1000 )和邊數M;隨後的M行對應M條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從1到N編號)。當N為0時輸入結束。

輸出描述:

每個測試用例的輸出佔一行,若歐拉回路存在則輸出1,否則輸出0。
示例1
輸入

3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
輸出

1
0

程式碼

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define N 1005
int n,m;
int a,b;
int degree[N];
int tree[N];

int findroot(int x){               //並查集的方式判斷圖連通性
    if(tree[x]==-1)
        return
x; else{ int temp = findroot(tree[x]); tree[x] = temp; return temp; } } int main(){ while(cin>>n && n){ cin>>m; memset(tree, -1, sizeof(tree)); memset(degree, 0, sizeof(degree)); for(int i=0; i<m; i++){ cin>>a>>b; int tempa = findroot(a); int tempb = findroot(b); if(tempa != tempb) tree[tempa] = tempb; degree[a]++; //無向圖記錄度數 degree[b]++; } int flag = 0; int ans = 0; for(int i=1; i<= n; i++){ //判斷連通性 if(tree[i]==-1) ans++; } for(int i=1; i<=n; i++){ //判斷度數 if(degree[i]%2){ flag = 1; break; } } if(ans > 1 || flag) cout<<"0"<<endl; else cout<<"1"<<endl; } }

相關推薦

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

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

HDU 1878-(簡單的判斷)

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1878 歐拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot

poj1386有向圖判斷是否存在或者

第一個 include 構圖 cannot tdi ear 首字母 字符 else 有向圖的圖聯通是指基圖聯通,也就是把有向圖的邊改成無向圖然後看是否連通。判斷聯通可用dfs或者並查集。 題意就是給你n個由小寫字母構成的字符串,問你能不能將這n個字符

計蒜客 | 圖 | 判斷

conn mar map sca thml gin def 是否 bool 你學過一筆畫問題麽?其實一筆畫問題又叫歐拉回路,是指在畫的過程中,筆不離開紙,且圖中每條邊僅畫一次,而且可以回到起點的一條回路。 蒜頭君打算考考你,給你一個圖,問是否存在歐拉回路? 輸入格式 第

UVA12188-Inspector's Dilemma(+連通性判斷)

course string namespace .cn div pro 相對 pos cit Problem UVA12188-Inspector‘s Dilemma Time Limit: 3000 mSec Problem Description In a c

無向圖判斷是否存在尤通路和

利用並查集 #include<bits/stdc++.h> #define PI 3.1415926 using namespace std; const int maxn = 1003; int P,Q; ///P為頂點數,Q為邊數 int degree[maxn]; /

判斷混合圖(既有有向邊又有無向邊)存在方法

  假設有一張圖有向圖G',在不論方向的情況下它與G同構。並且G'包含了G的所有有向邊。那麼如果存在一個圖G'使得G'存在歐拉回路,那麼G就存在歐拉回路。   其思路就將混合圖轉換成有向圖判斷。實現的時候,我們使用網路流的模型。現任意構造一個G'。用Ii表示第i個點的入度,Oi表示第i個點的出度。如果存在一

poj 2513 +並查集判斷是否聯通+Trie樹

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

判斷

基礎概念 首先來看一下離散數學中的一些基礎概念: 通路:在無向圖中由點邊交替組成的序列就是通路(如果這個圖是簡單的,那麼也可以使用點的序列來表示),如果首尾的點相同,則稱為一條迴路 無向圖的連通性:無向圖中任意一對點之間均有通路 尤拉通路:從某個頂點出發

HDU NO.1878 (鄰接矩陣,判斷的條件)

題意:(中文略) 思路: 存在歐拉回路的條件:所有頂點的度為偶數,並且圖是聯通的(每個點都可以遍歷) 這一類問題利用鄰接矩陣比較方便。 原題描述: Description 歐拉回路是指不令筆離

判斷連通+度數為偶】

* 無向圖是尤拉圖的充要條件是所有點的度為偶數並且所有點聯通* 解決是否為偶數很簡單,問題似乎變成了判斷連通呢? 1.並查集 2.深搜一下就好了 並查集: #include <iostr

hdu 判斷

通過圖中所有邊1次且僅1次行遍所有頂點的通路稱作尤拉通路。 通過圖中所有邊1次且僅1次行遍所有頂點的迴路稱作歐拉回路。 具有歐拉回路的圖稱為尤拉圖。 具有尤拉通路而無歐拉回路的圖成為半尤拉圖。 無向圖: G是尤拉圖當且僅當G是是連通圖且沒有奇度頂點 G是半尤拉圖當且僅當G是

LOJ-10106(有向圖判斷

鏈接 sin img n) blog problem space 分享圖片 ems 題目鏈接:傳送門 思路: (1)將每個單詞視為有向路徑,單詞的起始字母是起始節點,末尾字母是終止節點,然後找由字母建立的有向圖 是否是歐拉圖或者半歐拉圖。 (2)先用並查集判斷是否連通,再判

Uva 10129 (dfs判斷連通 +

傳送門!!!!!!!!----->點選開啟題目連結 題意:輸入一個n代表有n個單詞,接下來輸入n個單詞,問是否可以把所有的單詞排成一個序列,使得每個單詞的第一個字母和上一個單詞的最後一個字母相同。 思路:把字母看成節點,單詞看成有向邊,建圖。當且僅當途中存在尤拉路徑時

poj 1637 判斷混合圖是否存在

題意: 就是對有無向邊和有向邊的混合圖,判斷存不存在歐拉回路。  若圖G中存在這樣一條路徑,使得它恰通過G中每條邊一次,則稱該路徑為尤拉路徑。若該路徑是一個圈,則稱為尤拉(Euler)迴路。 參考下面的解釋: 【混合圖】 混合圖(既有有向邊又有無向邊的圖)中尤拉環、尤拉路

put ++ .cn -1 bool ret 技術分享 代碼 can 思路 根據歐拉圖的概念來。 註意 點數為1; 有孤立點; 代碼實現 T掉的dfs... 1 #include<cstdio> 2 const int max

UVA 10196 Morning Walk(

ble move eve man first pre intersect sum ons Problem H Morning Walk Time Limit 3 Seconds Kamalis a Motashotaguy. He has

[] poj 1300 Door Man

linker center || 是否 connect sep cto -m vector 題目鏈接: http://poj.org/problem?id=1300 Door Man Time Limit: 1000

hdu1878(DFS+)

out sin 整數 white 偶數 ret pad bottom -m 歐拉回路 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

[模板][持續更新]路徑淺析

bits solution 算法 -1 要求 logs 鏈式前向星 namespace src Luogu P2731 騎馬修柵欄 Riding the Fences 題目背景 Farmer John每年有很多柵欄要修理。他總是騎著馬穿過每一個柵欄並修復它破損的地方。 題目