HDU-1878-欧拉回路
2016-04-12 18:07
344 查看
欧拉回路
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11933 Accepted Submission(s): 4402
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
这个与一笔画问题非常相似一笔画意思是一笔连通一个树,但是这个是要构成回路那么不同的地方就在于欧拉回路是没有奇数度的,但是一笔画问题可以有连个奇数度,比较一下这两个题的代码,就在cnt==0||cnt==2处去掉了cnt==2而已。
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> using namespace std; int p[1001]; int degree[1001]; int N,P,Q; int find(int x){ if(x!=p[x]) p[x]=find(p[x]); return p[x]; } void merge(int x,int y){ x=find(x); y=find(y); if(x!=y) p[x]=y; } void init(){ for(int i=0;i<=P;i++) p[i]=i; } int main() { int a,b; while(cin>>P,P){ memset(degree,0,sizeof(degree)); cin>>Q; init(); while(Q--){ cin>>a>>b; degree[a]++; degree[b]++; merge(a,b); } int ans=0,cnt=0; for(int i=1;i<=P;i++){ if(p[i]==i) ans++; if(degree[i]%2) cnt++; } if(ans==1&&cnt==0) puts("1"); else puts("0"); } return 0; }
相关文章推荐
- Google Code Jam 2016 资格赛
- 循环中变量定义问题
- 接口与抽象类
- 自己写的内存分配算法
- Leetcode_171_Excel Sheet Column Number
- Tyvj_P1006
- [IOS]Protocol协议及委托代理(Delegate)传值-用代码寻找storyboard相应视图
- 网络子系统在链路层的收发过程剖析(一)【转】
- Nexus Repository Manager OSS 代理 p2 源
- 课堂练习(返回一个环状一维整数数组中最大子数组的和)
- Linux内核读书笔记第六周
- 票据OCR前预处理 (附Demo)
- Android 之历史搜索Demo
- 彻底学会使用epoll(六)——关于ET的若干问题总结
- 基于Python的卷积神经网络和特征提取
- OpenCascade中网格的数据结构
- clob变量值无法使用v$sql_bind_capture获得
- 命不好,因为你同床共枕的人
- 【mysql】的基本使用
- shell中$0,$?,$!等的特殊用法