欧拉回路
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
1 0
#include<cstdio> #include<cstring> #include<vector> using namespace std; vector <int> f[1010]; int flag[1010],flag2[1010];//flag[i]记录i点的度,flag2[i]记录i点是否遍历 int N,M; void init(){//初始化 memset(flag,0,sizeof(flag)); memset(flag2,0,sizeof(flag2)); for(int i=1;i<=N;i++) f[i].clear(); } void DFS(int point){ flag2[point]=1; for(int i=0;i<f[point].size();i++){ int next=f[point][i]; if(!flag2[next]) DFS(next); } } int main() { while(scanf("%d",&N)==1&&N){ scanf("%d",&M); init(); int a,b; for(int i=0;i<M;i++){ scanf("%d%d",&a,&b); f[a].push_back(b); f[b].push_back(a); flag[a]++; flag[b]++; } bool key1=true; for(int i=1;i<=N;i++) if(flag[i]%2){ key1=false; break; } if(key1){//有一个度为奇数,则不存在。全为偶数,继续判断 bool key2=true; DFS(1); for(int i=1;i<=N;i++) if(!flag2[i]){//若全部遍历,则存在,反之不存在 key2=false; break; } if(key2) printf("1\n"); else printf("0\n"); } else printf("0\n"); } return 0; }还有用并查集,然而我还没系统的学~他人代码如下:
#include<stdio.h> using namespace std; int pre[1007],dge[1007]; int n,m; void init() { for(int i=1;i<=n;i++) { pre[i]=i; dge[i]=0; } } int find(int x) { while(x!=pre[x]) x=pre[x]; return x; } void unio(int i,int j) { /*int x=find(i); int y=find(j); if(x==y)return; pre[x]=y;*/ pre[j]=find(i); } int main() { while(scanf("%d",&n),n) { scanf("%d",&m); init(); int a,b; while(m--) { scanf("%d%d",&a,&b); dge[a]++; dge[b]++; if(find(a)!=find(b)) unio(a,b); } int flag=0; for(int i=1;i<=n;i++) if(dge[i]%2) { printf("0\n"); flag=1; break; } if(flag)continue; int x=pre[1]; for(int i=2;i<=n;i++) if(x!=find(i)) { flag=1; break; } if(flag) printf("0\n"); else printf("1\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 1878.欧拉回路【欧拉路及欧拉回路初接触】【8月2】
原文地址:http://blog.csdn.net/a995549572/article/details/47209203