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 }

acm1878欧拉回路

时间: 2024-10-14 04:25:45

acm1878欧拉回路的相关文章

杭电ACM1878——欧拉回路

简单的欧拉回路,如题. 欧拉回路的判断: 1.在有向图中:首先必要的条件是图连通,所以顶点的入度都等于出度. 2.在无向图中:首要条件还是图连通,其次就是所以顶点都是偶数度(该顶点的度为偶数) 这一题是无向图,所以根据判断方法来写,很简单,判定就不证明了. 我是用并查集来判断图是否连通的. 下面是AC的代码: #include <iostream> #include <cstring> using namespace std; int par[1005], degree[1005]

混合图的欧拉回路判定

对于有向图和无向图的欧拉回路判定,很容易做到.那对于混合图呢?? 混合图就是图中既存在无向边又存在有向边的图. 至于解法: 转载自这里 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路.因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路. 好了,现在每个点入度和出度之差均为偶数.那么将这个偶数除以2,得x.也就是说,对于每一个点,只要将x条边改变方向(入>出就是变入,出>入就是变出),就能保证出 = 入.如果

hdu1116 欧拉回路

1 //Accepted 248 KB 125 ms 2 //欧拉回路 3 //以26个字母为定点,一个单词为从首字母到末尾字母的一条边 4 //下面就是有向图判断欧拉回路 5 //连通+节点入度和==出度和 或者 存在一对节点一个入度比出度大1,一个小1 6 #include <cstdio> 7 #include <cstring> 8 #include <iostream> 9 #include <queue> 10 using namespace s

POJ 1041 John&#39;s trip 无向图的【欧拉回路】路径输出

欧拉回路第一题TVT 本题的一个小技巧在于: [建立一个存放点与边关系的邻接矩阵] 1.先判断是否存在欧拉路径 无向图: 欧拉回路:连通 + 所有定点的度为偶数 欧拉路径:连通 + 除源点和终点外都为偶数 有向图: 欧拉回路:连通 + 所有点的入度 == 出度 欧拉路径:连通 + 源点 出度-入度=1 && 终点 入度 - 出度 = 1 && 其余点 入度 == 出度: 2.求欧拉路径 : step 1:选取起点(如果是点的度数全为偶数任意点为S如果有两个点的度数位奇数取一

寒假集训日志(二)——最小生成树,拓扑排序,欧拉回路,连通路

今天学的内容挺多的. (一)首先说最小生成树,两种算法: 1.Kruskal算法( 将边排序,然后再选,关键在于检查是否连通,使用并查集) 2.Prim算法(使用点集,有点类似与最短路的算法) 第一题是并查集算法的使用: A - The Suspects Time Limit:1000MS     Memory Limit:20000KB     64bit IO Format:%I64d & %I64u Submit Status Description 严重急性呼吸系统综合症( SARS),

HDU-1878 判断无向图欧拉回路,水

HDU 1878 题意:问一个无向图是否存在欧拉回路. 总结: 1.一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图.2.一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图.3.要判断一个混合图G(V,E)(既有有向边又有无向边)是欧拉图,方法如下:假设有一张图有向图G',在不论方向的情况下它与G同构.并且G'包含了G的所有有向边.那么如果存在一个图G'使得G'存在欧拉回路,那么G就存在欧拉回路. // HDU-1878 #include<bits/stdc++

HDU 5883 F - The Best Path 欧拉通路 &amp; 欧拉回路

给定一个图,要求选一个点作为起点,然后经过每条边一次,然后把访问过的点异或起来(访问一次就异或一次),然后求最大值. 首先为什么会有最大值这样的分类?就是因为你开始点选择不同,欧拉回路的结果不同,因为是回路,所以你的开始点就会被访问多一次,所以如果是欧拉回路的话,还需要O(n)扫一次,枚举每个点作为起点. 欧拉通路的话,结果是固定的,因为只能从奇数度小的那个点作为起点,奇数度大的那个点作为终点. 关于点的访问次数:anstime  = Degree[i] / 2; //如果是奇数的,还要加上一.

HDU5883 The Best Path(欧拉回路 | 通路下求XOR的最大值)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5883 思路: 先判断原图是否是欧拉回路或者欧拉通路.是的话如果一个点的度数除以2是奇数则可以产生一个XOR贡献值.之后如果是欧拉通路, 则答案是固定的,起点和终点需要多产生一次贡献值. 如果是欧拉回路, 则需要枚举起点. 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #inclu

POJ1300Door Man(欧拉回路)

Door Man Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2639   Accepted: 1071 Description You are a butler in a large mansion. This mansion has so many rooms that they are merely referred to by number (room 0, 1, 2, 3, etc...). Your mas