pat 甲级 图 A1126 Eulerian Path (25分)欧拉图判别

10 篇文章 0 订阅

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 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 Eulerian, Semi-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

 参考柳神:https://blog.csdn.net/liuchuo/article/details/60479835

#include<iostream>
#include<vector>
using namespace std;
vector<int> v[510];
vector<bool> visit(510);
int cnt=0;
void dfs(int index){
	visit[index]=true;
	cnt++;
	for(int i=0;i<v[index].size();i++){
		if(visit[v[index][i]]==false)
		dfs(v[index][i]);
	}
}
int main(){
	int n,m,a,b;
	cin>>n>>m;
	for(int i=0;i<m;i++){
		cin>>a>>b;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	int even=0;
	for(int i=1;i<=n;i++){
		if(i!=1) printf(" ");
		printf("%d",v[i].size());
		if(v[i].size()%2==0) even++;
	}
	dfs(1);
	if(cnt==n&&even==n) printf("\nEulerian\n");
	else if(cnt==n&&even==n-2) printf("\nSemi-Eulerian\n");
	else printf("\nNon-Eulerian\n");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
对于无向,欧拉回路的判定条件是所有顶点的度数都为偶数,因此可以通过统计每个顶点的度数来判断是否存在欧拉回路。对于有向,欧拉回路的判定条件是每个顶点的入度等于出度,因此需要统计每个顶点的入度和出度。以下是用C语言实现的无向和有向欧拉回路的判定代码: ```c #include <stdio.h> #define MAXN 1000 int G[MAXN][MAXN]; // 邻接矩阵表示 int degree[MAXN]; // 存储每个顶点的度数(无向)或入度减出度(有向) int isEulerian(int n, int isDirected) { int i, j, odd = 0; for (i = 0; i < n; i++) { degree[i] = 0; for (j = 0; j < n; j++) { if (G[i][j]) { degree[i]++; } } if (degree[i] % 2 == 1) { odd++; } } if (isDirected) { for (i = 0; i < n; i++) { degree[i] = 0; for (j = 0; j < n; j++) { if (G[i][j]) { degree[i]++; degree[j]--; } } if (degree[i] != 0) { return 0; } } } return (odd == 0); } int main() { int n, m, i, j, a, b, isDirected; scanf("%d%d%d", &n, &m, &isDirected); for (i = 0; i < m; i++) { scanf("%d%d", &a, &b); G[a][b] = G[b][a] = 1; // 无向边的两个方向都要标记 if (isDirected) { G[a][b] = 1; // 有向只需要标记一次 } } if (isEulerian(n, isDirected)) { printf("Exist Eulerian circuit\n"); } else { printf("Not exist Eulerian circuit\n"); } return 0; } ``` 其中,`G` 是一个大小为 `n` 的邻接矩阵,如果 `G[i][j]` 为 `1`,则表示存在从顶点 `i` 到顶点 `j` 的边。`degree` 数组用于存储每个顶点的度数或入度减出度。`isEulerian` 函数判断是否存在欧拉回路,其中 `n` 表示顶点数,`isDirected` 表示是否为有向,返回值为 `1` 则表示存在欧拉回路,否则不存在。在 `main` 函数中,首先读入的信息,然后调用 `isEulerian` 函数判断是否存在欧拉回路,并输出结果。 需要注意的是,对于无向,如果存在欧拉回路,则可以随便从一个顶点出发,遍历整个;对于有向,则需要从一个入度等于出度的顶点出发,遍历整个。因此,如果存在欧拉回路,还需要找到一个起点,并输出遍历路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值