PAT 1126 Eulerian Path

In graph theory, an Eulerian path is a path in a graph which visits every edge exactly once. Similarly, an Eulerian circuit is an Eulerian path which starts and ends on the same vertex. They were first discussed by Leonhard Euler while solving the famous Seven Bridges of Konigsberg problem in 1736. It has been proven that connected graphs with all vertices of even degree have an Eulerian circuit, and such graphs are called Eulerian. If there are exactly two vertices of odd degree, all Eulerian paths start at one of them and end at the other. A graph that has an Eulerian path but not an Eulerian circuit is called semi-Eulerian. (Cited from https://en.wikipedia.org/wiki/Eulerian_path)

Given an undirected graph, you are supposed to tell if it is Eulerian, semi-Eulerian, or non-Eulerian.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 2 numbers N (≤ 500), and M, which are the total number of vertices, and the number of edges, respectively. Then M lines follow, each describes an edge by giving the two ends of the edge (the vertices are numbered from 1 to N).

Output Specification:

For each test case, first print in a line the degrees of the vertices in ascending order of their indices. Then in the next line print your conclusion about the graph -- either EulerianSemi-Eulerian, or Non-Eulerian. Note that all the numbers in the first line must be separated by exactly 1 space, and there must be no extra space at the beginning or the end of the line.

Sample Input 1:

7 12
5 7
1 2
1 3
2 3
2 4
3 4
5 2
7 6
6 3
4 5
6 4
5 6

Sample Output 1:

2 4 4 4 4 4 2
Eulerian

Sample Input 2:

6 10
1 2
1 3
2 3
2 4
3 4
5 2
6 3
4 5
6 4
5 6

Sample Output 2:

2 4 4 4 3 3
Semi-Eulerian

Sample Input 3:

5 8
1 2
2 5
5 4
4 1
1 3
3 2
3 4
5 3

Sample Output 3:

3 3 4 3 3
Non-Eulerian

思路:就是找出每个节点的度为偶数的节点个数;如果度全为偶数,就是欧拉图, 如果只有两个点的度不是偶数就是半欧拉图, 否则不是欧拉图;

注意点:欧拉图或者半欧拉图的前提是图是连通的

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 vector<int> vis(505, false);
 5 vector<int> v[505];
 6 void dfs(int node){
 7   vis[node] = true;
 8   for(int i=0; i<v[node].size(); i++)
 9    if(!vis[v[node][i]]) dfs(v[node][i]);
10 }
11 int main(){
12   long n, k, i;
13   cin>>n>>k;
14
15   for(i=0; i<k; i++){
16     int a, b;
17     cin>>a>>b;
18     v[a].push_back(b);
19     v[b].push_back(a);
20   }
21   vector<int> num(505,0);
22   int odd=0, even=0;
23   for(i=1; i<=n; i++){
24     num[i] = v[i].size();
25     if(num[i]%2==0) even++;
26     else odd++;
27   }
28   for(i=1; i<=n; i++){
29     if(i==1) cout<<num[i];
30     else cout<<" "<<num[i];
31   }
32   cout<<endl;
33   int cnt=0;
34   for(i=1; i<=n; i++){
35     if(!vis[i]){
36       dfs(i);
37       cnt++;
38     }
39   }
40   if(cnt!=1) cout<<"Non-Eulerian"<<endl;
41   else{
42     if(even==n) cout<<"Eulerian"<<endl;
43     else if(odd==2) cout<<"Semi-Eulerian"<<endl;
44     else cout<<"Non-Eulerian"<<endl;
45   }
46
47   return 0;
48 }

原文地址:https://www.cnblogs.com/mr-stn/p/9240527.html

时间: 2024-07-31 18:54:54

PAT 1126 Eulerian Path的相关文章

1126 Eulerian Path (25 分)

1126 Eulerian Path (25 分) In graph theory, an Eulerian path is a path in a graph which visits every edge exactly once. Similarly, an Eulerian circuit is an Eulerian path which starts and ends on the same vertex. They were first discussed by Leonhard

PAT 甲级 1126 Eulerian Path

https://pintia.cn/problem-sets/994805342720868352/problems/994805349851185152 In graph theory, an Eulerian path is a path in a graph which visits every edge exactly once. Similarly, an Eulerian circuit is an Eulerian path which starts and ends on the

PAT A1126 Eulerian Path (25 分)

In graph theory, an Eulerian path is a path in a graph which visits every edge exactly once. Similarly, an Eulerian circuit is an Eulerian path which starts and ends on the same vertex. They were first discussed by Leonhard Euler while solving the fa

1126 Eulerian Path

题意:若图是连通图,且所有结点的度均为偶数,则称为Eulerian:若有且仅有两个结点的度为奇数,则称为semi-Eulerian.现给出一个图,要我们判断其是否为Eulerian,semi-Eulerian还是not-Eulerian. 思路:在数据输入的时候计算各个节点的度:在输出各个节点的度的同时记录度为奇数的结点个数:最后判断判断图是否连通.这种题不考察什么算法,关键要我们理解题意,往往都是很简单的! 代码: #include <cstdio> #include <cstring

PAT_A1126#Eulerian Path

Source: PAT A1126 Eulerian Path (25 分) Description: In graph theory, an Eulerian path is a path in a graph which visits every edge exactly once. Similarly, an Eulerian circuit is an Eulerian path which starts and ends on the same vertex. They were fi

Graph | Eulerian path

In graph theory, a Eulerian trail (or Eulerian path) is a trail in a graph which visits every edge exactly once. Similarly, an Eulerian circuit or Eulerian cycle is an Eulerian trail which starts and ends on the same vertex. Hierholzer's algorithm 可以

PAT:1053. Path of Equal Weight (30) AC

#include<stdio.h> #include<vector> #include<queue> #include<algorithm> using namespace std; const int MAX=1010; int n,m; //n个节点,m个非叶子节点 long long int S; //待测权值 long long int weight[MAX]; //每个节点的权值 vector<int> child[MAX]; //存储

PAT Advanced 1053 Path of Equal Weight (30) [树的遍历]

题目 Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. The weight of a path from R to L is defined to be the sum of the weights of all the nodes along the path from R to any leaf node L. Now given any weighted tree,

A题目

1 1001 A+B Format(20) 2 1002 A+B for Polynomials(25) 3 1003 Emergency(25) 4 1004 Counting Leaves(30) 5 1005 Spell It Right(20) 6 1006 Sign In and Sign Out(25) 7 1007 Maximum Subsequence Sum(25) 8 1008 Elevator(20) 9 1009 Product of Polynomials(25) 10