OJ_1027 欧拉回路
2014-02-15 08:59
176 查看
#include <iostream> using namespace std; int set[1001]={0}; int degree[1001]={0}; void init(int n) { for(int i=1;i<=n;i++) { set[i]=i; degree[i]=0; } } int find(int x) { while(x!=set[x]) x=set[x]; return x; } void unionset(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) set[fy]=fx; } void func() { int n,m; while(cin>>n) { if(n==0)break; cin>>m; init(n); for(int i=0;i<m;i++) { int l,r; cin>>l>>r; degree[l]++; degree[r]++; unionset(l,r); } int count=0; bool flag2=true; for(int i=1;i<=n;i++) { if(i==set[i]) { count++; } if(degree[i]%2==1||degree[i]==0) { flag2=false; break; } } if(count==1&&flag2) cout<<"1"<<endl; else cout<<"0"<<endl; } } int main(int argc, char *argv[]) { //printf("Hello, world\n"); func(); return 0; }
欧拉回路:利用 并查集计算所有点是否相通(集合个数为1),同时判断所有点的度数是否为2
DFS也可以解
题目描述:
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
输入:
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。
输出:
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
样例输入:
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
样例输出:
1 0
相关文章推荐
- 九度OJ 1027:欧拉回路 (欧拉回路)
- 九度OJ 1027:欧拉回路 (欧拉回路)
- 【九度OJ】1027【欧拉回路】【C实现】【浙大2008】
- HDOJ-1878欧拉回路 && 九度OJ-1027欧拉回路
- 九度OJ-题目1027 欧拉回路
- 九度 题目1027:欧拉回路
- 南邮 OJ 1027 Quicksum
- 题目1027:欧拉回路
- 九度OnlineJudge之1027:欧拉回路
- 题目1027:欧拉回路
- oj1027
- 【杭电oj】1878 - 欧拉回路(欧拉回路,并查集)
- 【杭电oj】1027 - Ignatius and the Princess II(STL - 全排列)
- 九度:题目1027:欧拉回路
- 九度[1027]-欧拉回路
- 九度1027(判断欧拉回路)
- hrbust 哈理工oj 1633 word!word!【欧拉路、欧拉回路的有向图判断】
- 图(非递归)_题目1027:欧拉回路
- uoj#117. 欧拉回路
- 九度1027:欧拉回路