[置頂] HDOJ 1811 歐拉回路 (判斷歐拉回路)


歐拉回路


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  
Source 浙大計算機研究生復試上機考試-2008年  
Recommend We have carefully selected several similar problems for you:  1879 1880 1877 1881 1863   
分析: 無向圖歐拉回路的充要條件: (1)連通圖 、(2)所有節點的入度為偶數。
判斷連通圖:隨意找一個結點,對連通的結點dfs、vis一遍,並用vis標記。跑完dfs后如果還有點沒有vis,說明不是連通圖。
坑點: 依舊是重邊╮(╯▽╰)╭ 。

#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <algorithm>
#define inf 0x3f3f3f3f
#define PI 3.14159265358979323
#define SCD(a) scanf("%d",&a)
#define SCDD(a,b) scanf("%d%d",&a,&b)
#define SCF(a) scanf("%lf",&a)
#define PTD(a) printf("%d\n",a)
#define PTS(a) printf("%s\n",a)
#define MST(a) memset(a, 0, sizeof(a))
using namespace std;
// HDOJ 1878

int n,m;
const int L = 1011;
int vis[L], maz[L][L];
void bfs(int st)
{
int i;
for(i=1;i<=n;i++){
if(!vis[i]&&maz[st][i]){
vis[i] = 1;
bfs(i);
}
}
}
int main()
{
while(~SCD(n)&&n){
SCD(m);
MST(vis);
int a, b;
int in[L]; //入度
MST(in);
int i;
MST(maz);
for(i=1;i<=m;i++){
SCDD(a,b);
if(!maz[a][b]){ //去重
maz[a][b] = maz[b][a] = 1;
in[b]++;
in[a]++;
}
}
bfs(1);
bool ans = true;
for(i=1;i<=n;i++){
if(!vis[i]||in[i]%2==1)
ans = false;
}
if(ans)
PTD(1);
else
PTD(0);
}
return 0;
}
/*
Sample Input
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0

Sample Output
1
0

*/







注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com