HDU 1878 欧拉回路

来源:互联网 发布:生死狙击矩阵图片 编辑:程序博客网 时间:2024/06/02 04:16

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

题解:题面即题解。
判断无向图是否存在欧拉回路。
读错题了md。

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}    return x*f;}const int N = 1000 + 10;int n,m;int in[N],fa[N],vis[N],siz[N];int find(int x){    if(x==fa[x]) return fa[x];    return fa[x]=find(fa[x]);}#define ms(x,y) memset(x,y,sizeof(x))void update(){    ms(in,0);ms(vis,0);    for(int i=1;i<=n;i++) fa[i]=i,siz[i]=1;}int main(){    while(1){        n=read();if(n==0) break;        m=read();update();        for(int i=1;i<=m;++i){            int u=read(),v=read();            int x=find(fa[u]),y=find(fa[v]);            ++in[u],++in[v];            if(x==y) continue;            fa[x]=y,siz[y]+=siz[x];        }        int sum=0,f=find(1);        bool flag=false;                for(int i=1;i<=n;i++){            int x=find(i);            if(x!=f) {flag=true;break;}            if(in[i]&1) ++sum;        }        if(flag||sum!=0) printf("0\n");        else printf("1\n");    }    return 0;}
原创粉丝点击