判定歐拉回路
你學過一筆畫問題麼?其實一筆畫問題又叫歐拉回路,是指在畫的過程中,筆不離開紙,且圖中每條邊僅畫一次,而且可以回到起點的一條迴路。
蒜頭君打算考考你,給你一個圖,問是否存在歐拉回路?
輸入格式
第 11 行輸入兩個正整數,分別是節點數 N(1 < N < 1000)N(1<N<1000) 和邊數 M(1 < M < 100000)M(1<M<100000);
緊接著 MM 行對應 MM 條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點的編號(節點從 11 到 NN 編號)。
輸出格式
若存在歐拉回路則輸出 11,否則輸出 0
0
#include <iostream>
#include <cstring>
using namespace std;
const int MAX_N = 100000;
const int MAX_M = 10000000;
struct edge {
int v, next;
int len;
} E[MAX_M];
int p[MAX_N], eid;
void init() {
memset(p, -1, sizeof(p));
eid = 0;
}
void insert(int u, int v) {
E[eid].v = v;
E[eid].next = p[u];
p[u] = eid++;
}
int n,m;
int degree[MAX_N];
int cnt;
bool vis[MAX_N];
void dfs(int u){
vis[u]=true;
cnt++;
for(int i=p[u];i!=-1;i=E[i].next){
int v=E[i].v;
if(!vis[v]){
dfs(v);
}
}
}
void euler(){
dfs(1);
if(cnt!=n){
cout<<"0"<<endl;
return ;
}
int cntodd=0;
for(int i=1;i<=n;i++){
if(degree[i]%2==1){
cntodd++;
}
}
if(cntodd==0){
cout<<"1"<<endl;
}else if(cntodd==2){
cout<<"0"<<endl;
}else{
cout<<"0"<<endl;
}
}
int main() {
init();
memset(degree,0,sizeof(degree));
cin>>n>>m;
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;
insert(u,v);
insert(v,u);
degree[u]++;
degree[v]++;
}
euler();
return 0;
}
相關推薦
計蒜客習題:判定歐拉回路
問題描述 你學過一筆畫問題麼?其實一筆畫問題又叫歐拉回路,是指在畫的過程中,筆不離開紙,且圖中每條邊僅畫一次,而且可以回到起點的一條迴路。 蒜頭君打算考考你,給你一個圖,問是否存在歐拉回路?
判定歐拉回路
你學過一筆畫問題麼?其實一筆畫問題又叫歐拉回路,是指在畫的過程中,筆不離開紙,且圖中每條邊僅畫一次,而且可以回到起點的一條迴路。蒜頭君打算考考你,給你一個圖,問是否存在歐拉回路?輸入格式第 11 行輸入兩個正整數,分別是節點數 N(1 < N < 1000)N(1
無向圖歐拉道路(歐拉回路)的判定與路徑打印
clu clas 檢查 names 連通圖 思路 return space 計算 歐拉道路描述的是無向圖的一個頂點出發的一條道路能夠經過每條邊恰好一次 歐拉回路指的是任意點出發都滿足上述性質 如果一個圖是歐拉道路或者歐拉回路,必須滿足兩個條件 第一個條件,這個圖是連通圖 第
初學歐拉回路/路徑的判定 & 尤拉圖的有關問題
歐拉回路 簡介: 歐拉回路:每條邊恰好只走一次,並能回到出發點的路徑. 尤拉路徑:經過每一條邊一次,但是不要求回到出發點. 尤拉圖:圖當且僅存在歐拉回路. 半尤拉圖:圖當且僅存在尤拉路徑. 常規操作: 關於尤拉圖的問題,一般是判迴路的存在性或生
有向圖的歐拉回路判定問題 poj1386
這個題也卡卡卡,發現自己好粗心,唉.。 有向圖的判定: 統計每個點的出度和入度, 前提是有向圖是連通圖。 1. 如果每個點的出度 = 入度 則存在歐拉回路。 2. 如果有且僅有兩點出度、入度不想等,且這兩個點的出度 - 入度差為1 或 -1.
hud 1878 歐拉回路的判定
Problem Description 歐拉回路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定一個圖,問是否存在歐拉回路? Input 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數N ( 1 <
[BZOJ2095]-[Poi2010]Bridges-二分答案+混合圖歐拉回路判定
說在前面 寫這道題順便學了學混合圖歐拉回路判定,感覺自己萌萌噠! 話說me網路流連反向邊都忘記建了,居然還可以過樣例??? 一直以來都十分佩服樣例資料,以及造資料的人,無論程式有什麼bug都能跑對… 題目 題面 (直接概括題目大意就沒什麼意思
Poj 1637 Sightseeing tour (混合圖的歐拉回路判定)
題意:給出一個混合圖,要求判定歐拉回路是否存在,輸入 x y d,如果d為0則為無向邊,為1則為有向邊。 首先應該判定圖的連通性!本題所給圖均是連通的,所以沒有判斷。 對所有的無向邊隨便定向,之後再進行調整。 統計每個點的出入度,如果有某個點出入度之差為奇數,則不存在歐
歐拉回路
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每年有很多柵欄要修理。他總是騎著馬穿過每一個柵欄並修復它破損的地方。 題目
51nod 1967 路徑定向(不錯的歐拉回路)
cnblogs 偶數 ret mes stack ostream lin .html pre http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 題意: 思路: 出度=入度,這
The Necklace UVA - 10054 (無向圖的歐拉回路)
n) 兩個 logs nec get dfs lap none view The Necklace UVA - 10054 題意:每個珠子有兩個顏色,給n個珠子,問能不能連成一個項鏈,使得項鏈相鄰的珠子顏色相同。 把顏色看做點,珠子內部連一條邊,無向圖求歐拉回路。 這
算法復習——歐拉回路混合圖(bzoj2095二分+網絡流)
n) truct lin 歐拉圖 所有 mage borde algo stream 題目: Description YYD為了減肥,他來到了瘦海,這是一個巨大的海,海中有n個小島,小島之間有m座橋連接,兩個小島之間不會有兩座橋,並且從一個小島可以到另外任意一個小島。現在
混合圖歐拉回路
所有 ace .cn geo urn 我們 方向 online n) http://acm.pku.edu.cn/JudgeOnline/problem?id=1273 給一組邊 有的是有向邊有的是無向邊 問是否存在歐拉回路 我們知道如果每個點入度等於出度 就存在歐拉回路
hdu 1956 (網絡流解決歐拉回路)
www 起點到終點 更改 什麽 tps 網絡流 個性 http 混合圖 題目連接:https://vjudge.net/problem/HDU-1956 題意:給定一些點和一些邊,有些邊是有向的,,有些邊是無向的,求是否存在歐拉回路。 題解:想不到的網絡流。 混合圖:即
51nod1967 路徑定向(歐拉回路+結論題)
void ++i col () view const stdio.h turn char 看到入度等於出度想到歐拉回路。 我們把邊都變成無向邊,有一個結論是偶數度的點都可以變成出入度相等的點,而奇數點的不行,感性理解分類討論一下就知道是對的。 還有一個更好理
poj1780歐拉回路
href tail poj scanf net str ons for lan 轉載 #include<cstdio> #include<cstring> const int N=1e6+88; bool vis[N]; char an