acm1878欧拉回路

欧拉回路解释

对于本题我们只要把每个点的度进行记录,判断是否存在奇数度的点,如果是就可以判断不是欧拉回路,如果不是就在一个点出发,进行dfs搜索,

看能否走到起点,因为对于欧拉回路是一个闭合的回路,无论在哪个点出发都应当可以走回起点,所以一次性遍历必将经过每个点,如果出现没有

走过的点,则不是欧拉回路。

 

 1 #include<iostream> 
 2 #include<cstring>
 3 using namespace std;
 4 const int maxn=1200;
 5 int degree[maxn];
 6 int vis[maxn];
 7 int maze[maxn][maxn];
 8 int n,m;
 9 void dfs(int i)
10 {
11     vis[i]=1;
12     for(int j=1;j<=n;j++)
13     {
14         if(!vis[j]&&maze[i][j])
15         {
16             dfs(j);
17         }
18     }
19     return;
20 }
21 int main()
22 {
23 
24     int a,b;
25     while(cin>>n&&n)
26     {
27         bool flag=false;
28         cin>>m;
29         memset(degree,0,sizeof(degree));
30         memset(maze,0,sizeof(maze));
31         memset(vis,0,sizeof(vis));
32         for(int i=1;i<=m;i++)
33         {
34             cin>>a>>b;
35             maze[a][b]=maze[b][a]=1;
36             degree[a]++;
37             degree[b]++;
38         }
39         for(int i=1;i<=n;i++)
40         {
41             if(degree[i]%2==1)
42                 flag=true;
43         }
44         if(flag)
45         {
46             cout<<0<<endl;
47             continue;
48         }
49         int p=0;
50         for(int i=1;i<=n;i++)
51         {
52             if(!vis[i])
53             {
54                 p++;
55                 dfs(i);
56             }
57         }
58         if(p==1)cout<<1<<endl;
59         else cout<<0<<endl; 
60     }
61     return 0;
62 }

 

转载于:https://www.cnblogs.com/sytu/p/3871568.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值