HDU - 1878 - 欧拉回路
来源:互联网 发布:今晚美国公布什么数据 编辑:程序博客网 时间:2024/05/17 01:13
HDU 1878.欧拉回路
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
首先要知道什么是欧拉回路,在图中若存在一条回路,经过图中每边
一次且仅且一次,就称为欧拉回路
判定方法:当且仅当图是连通的,且所有结点度数全为偶数
用dfs判断是不是连通的,开个数组用来记录每个结点的度数就OK啦
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int d[1000][1000], vis[1000], du[1000];int n, m;void dfs(int a){ //判断图是不是连通的 vis[a] = 1; for(int i = 1; i <= n; i++) if(d[a][i] && !vis[i]) dfs(i);}int main(){ while(scanf("%d", &n)!=EOF && n){ scanf("%d", &m); memset(d, 0, sizeof(d)); memset(vis, 0, sizeof(vis)); memset(du, 0, sizeof(du)); for(int i = 1; i <= m; i++){ int a, b; scanf("%d %d", &a, &b); d[a][b] = d[b][a] = 1; du[a]++; //记录结点的度数 du[b]++; } dfs(1); int flag = 1; for(int i = 1; i <= n; i++){ if(!vis[i]){ //判断图是不是连通的 flag = 0; break; } if(du[i]%2){ //判断所有结点的度数是不是偶数 flag = 0; break; } } if(flag) printf("1\n"); else printf("0\n"); } return 0;}
0 0
- HDU 1878 欧拉回路
- hdu 1878 欧拉回路
- 【欧拉回路】hdu 1878
- hdu 1878 欧拉回路
- HDU 1878 欧拉回路
- hdu 1878 欧拉回路
- hdu 1878 欧拉回路
- hdu 1878 欧拉回路
- HDU-1878-欧拉回路
- Hdu 1878 欧拉回路
- hdu 1878 欧拉回路
- hdu 1878 欧拉回路
- hdu 1878 欧拉回路
- HDU 1878 欧拉回路
- hdu 1878 欧拉回路
- hdu 1878 欧拉回路
- HDU-1878 欧拉回路
- HDU 1878 欧拉回路
- 主机命令执行
- poj 2836 子集 状态压缩dp
- hdu 1312 Red and Black && POJ 1979 Red and Black
- LDAP + Gerrit搭建code review系统(二) --- LDAP
- event.target
- HDU - 1878 - 欧拉回路
- Android基础篇之Activity(四)-onSaveInstanceState()方法
- vs 检测内存泄漏
- 关系数据库还是NoSQL数据库
- https
- poj2502(SPFA+建图)
- 九度OJ 题目1446:Head of a Gang
- hdu 2015 偶数求和
- 全选、反选、多选、解决行与checkbox的冲突