计蒜客 | 欧拉回图 | 判断欧拉回路
Posted 如有一味绝境,非历十方生死
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计蒜客 | 欧拉回图 | 判断欧拉回路相关的知识,希望对你有一定的参考价值。
你学过一笔画问题么?其实一笔画问题又叫欧拉回路,是指在画的过程中,笔不离开纸,且图中每条边仅画一次,而且可以回到起点的一条回路。
蒜头君打算考考你,给你一个图,问是否存在欧拉回路?
输入格式
第 11 行输入两个正整数,分别是节点数 N(1 < N < 1000)N(1<N<1000) 和边数 M(1 < M < 100000)M(1<M<100000);
紧接着 MM 行对应 MM 条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从 11 到 NN 编号)。
输出格式
若存在欧拉回路则输出 11,否则输出 00。
样例输入
10 11 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 3 3 1
样例输出
1
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int MAP[1005][1005]; 5 int degree[1005]; 6 int visited[1005]; 7 void init(int n) //初始化 8 { 9 for(int i = 0; i <= n; i++) 10 for(int j = 0; j <= n; j++) 11 MAP[i][j] = 0; 12 13 for(int i = 0; i <= n; i++) 14 degree[i] = 0,visited[i] = 0; 15 16 } 17 18 void dfs(int v, int n) 19 { 20 visited[v] = 1; 21 for(int i = 1; i <= n; i++) 22 { 23 if(!visited[i] && MAP[v][i]) dfs(i,n); 24 } 25 } 26 27 int isConnected(int n) //判断连通图 28 { 29 for(int i = 1; i <= n; i++) 30 { 31 if(!visited[i]) return 0; 32 } 33 return 1; 34 } 35 36 int isOula(int n) //判断欧拉图 37 { 38 for(int i = 1; i <= n;i++) 39 { 40 if(degree[i]%2!=0) return 0; 41 } 42 return 1; 43 } 44 45 int main() 46 { 47 int n,m,a,b; 48 while(cin>>n>>m) 49 { 50 bool flag = false; 51 init(n); 52 while(m--) 53 { 54 scanf("%d %d",&a,&b); 55 MAP[a][b] = MAP[b][a] = 1; 56 degree[a]++; 57 degree[b]++; 58 } 59 60 dfs(1,n); 61 62 if(!isConnected(n)) { 63 cout<<"0"<<endl; 64 } 65 else { 66 if(isOula(n)) cout<<"1"<<endl; 67 else cout<<"0"<<endl; 68 } 69 70 } 71 72 return 0; 73 }
以上是关于计蒜客 | 欧拉回图 | 判断欧拉回路的主要内容,如果未能解决你的问题,请参考以下文章