HDU

来源:互联网 发布:sql注入绕过过滤 编辑:程序博客网 时间:2024/06/11 15:27

点击打开题目链接

欧拉回路

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14578    Accepted Submission(s): 5522


Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
 

Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
 

Sample Input
3 31 21 32 33 21 22 30
 

Sample Output
10
 

Author
ZJU
 

Source
浙大计算机研究生复试上机考试-2008年
 

Recommend
We have carefully selected several similar problems for you:  1880 1877 1881 1864 1874 
 

Statistic | Submit | Discuss | Note

基础欧拉回路题。

无向图:

判断欧拉回路即判断任何节点度是否为偶数。

判断欧拉通路即判断除去起点终点度为奇数,其余节点度为偶数

有向图:

判断欧拉回路即判断任何节点是否入度等于出度。

判断欧拉通路即判断除去起点出度比入度大1和终点入度比出度大1外,其余节点度入度是否等于出度。

思路:因为本题为无向图,所以只需要用一个in数组存各点的度,然后首先用并查集判断图是否连通,然后判断每个点度是否为偶数即可

附上AC代码:

#include<iostream>#include<cstring>using namespace std;const int maxn=1000+5;int par[maxn],in[maxn];int a,b;int N,M;void init(){    for(int i=0;i<=N;i++)        par[i]=i;        memset(in,0,sizeof(in));}int find(int a){    if(a==par[a])return a;    return par[a]=find(par[a]);}void unite(int a,int b){    a=find(a);    b=find(b);    if(a==b)return ;    else if(a>b)        par[a]=b;    else par[b]=a;}int main(){    ios::sync_with_stdio(false);    while(cin>>N,N)    {        init();        cin>>M;        for(int i=0;i<M;i++)        {            cin>>a>>b;            unite(a,b);            in[a]++;in[b]++;        }    int temp=find(1),flag=1;;    for(int i=1;i<=N;i++)    {        if(temp!=find(par[i])){flag=0;break;}        else if(in[i]%2){flag=0;break;}    }    if(flag)cout<<"1"<<endl;    else cout<<"0"<<endl;    }    return 0;}

0 0
原创粉丝点击