uva10054(递归+欧拉回路)
来源:互联网 发布:骏飞竞拍系统源码 编辑:程序博客网 时间:2024/05/29 16:00
https://vjudge.net/problem/UVA-10054(uva10054 点击打开链接)
分析:想做一下关于图的连通性的题目,然后就搜到了这个。结果把学的离散都还给离散老师了,看到题目根本想不到这是欧拉回路,自然也不知道怎么做,然后就去翻博客了。
题意:题意大概就是每两个数一组,然后i+1组的第一个数和第i组的第二个数相等,然后最后一组的第二个数和第一组的第一个数相等。(其实如果熟悉欧拉回路的话应该很容易发现这是欧拉回路,只是辣鸡,学东西太不扎实了,根本没搞清什么是欧拉回路,然后自然就想不到了,那么,问题来了,什么是欧拉回路呢?)
欧拉通路:无向图里,一条包括所有边,且其中每一条边只经过一次的路径。
欧拉回路:无向图里,一条包括所有边,且其中每一条边只经过一次的路径,最后又回到起点。
判断一个图中是否存在欧拉通路或欧拉回路:
- 一个图有欧拉回路当且仅当图是连通的且图中每个顶点的度数都是偶数。
- 一个图有欧拉通路当且仅当图是连通的,且除两个顶点外,其余顶点的度数都是偶数。
程序思路(模板思路):
- 统计图中每个顶点的度数,如果存在两个以上点的度数为奇数,那一定不是欧拉通路或欧拉回路。
- 若所有点的度数都是偶数,任选一个点,若有两个奇度点,任选一个奇度点。
- 每次遍历与该点相连的边,删除与该点相连的边,原图就转化成了一个更小的图,递归求解。
注意:该题中,两点之间并不是只有一条边,怎么处理,思考一下。
代码:
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <string>using namespace std;//degree记录每个顶点的度数int degree[55];//G记录每条边,u,v之间,有边就加加int G[55][55];//递归int euler(int u){ for(int i = 1;i <= 50;i++) { if(G[u][i]) { //只删边,每个顶点的度数不变 G[u][i]--; G[i][u]--;// degree[u]--;// degree[i]--; euler(i); //输出是递归到最后,然后一层一层的往后返,在返回时输出,但是注意i,u 还是u,i printf("%d %d\n",i,u); } }}int main(){ int t,k,u,v,ans = 0; scanf("%d",&t); while(t--) { ans++; scanf("%d",&k); //attach importance to 清零!!!! memset(degree,0,sizeof degree); memset(G,0,sizeof G); for(int i = 1;i <= k;i++) { scanf("%d%d",&u,&v); //边加加,顶点的度数加加 G[u][v]++; G[v][u]++; degree[u]++; degree[v]++; } int flag = 0; for(int i = 1;i <= 50;i++) { if(degree[i] % 2) { flag = 1; break;//奇度顶点 } } printf("Case #%d\n",ans); if(!flag) euler(v); else printf("some beads may be lost\n"); if(t) printf("\n"); }}
自己又找了一个两点之间只有一条边的,求欧拉回路或者欧拉通路的差不多的模板。
代码:
#include <iostream>#include <cstring>#include <vector>using namespace std;const int maxn = 10240;int n,m,pCnt[maxn];int pMap[maxn][maxn];vector<int> pVec;void Search(int x);void Euler_Circuit();int main(){ cin >> n >> m; memset(pMap,0,sizeof pMap); for(int i = 1; i <= m; i++) { int s,e; cin >> s >> e; pMap[s][e] = pMap[e][s] = 1;//有边,记为1 } Euler_Circuit(); return 0;}void Euler_Circuit(){ int nStart = 1,nOddNum = 0;//nStart保存起点,nOddNum保存有几个点有奇度数 memset(pCnt,0,sizeof pCnt); for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { pCnt[i] += pMap[i][j];//计算各个顶点的度数 } } for(int i = 1; i <= n; i++) { if(pCnt[i] && i) { nStart = i; nOddNum++; } } if(nOddNum > 2) { cout << "Not Exsit Euler Circuit" << endl; } else { Search(nStart); for(int i = 0;i < pVec.size();i++) { cout << pVec[i] << ' '; } cout << endl; }}void Search(int x){ for(int i = 1;i <= n;i++) { if(pMap[x][i] == 1) { pMap[x][i] = pMap[i][x] = 0;//删边 Search(i); } } pVec.push_back(x);//存入vector中,从头开始输出}
阅读全文
0 0
- uva10054(递归+欧拉回路)
- UVA10054欧拉回路
- UVa10054 The Necklace (欧拉回路)
- 图论 欧拉回路 uva10054
- 欧拉回路打印路径(两种)uva10054
- 【UVa10054】The Necklace【欧拉回路】
- UVA10054 The Necklace (输出欧拉回路)
- uva10054--欧拉回路--串珠子
- 欧拉回路及哈密顿回路浅见(UVA10054\POJ 2230\POJ2438\HDU1116)
- uva10054 The Necklace (欧拉回路路径输出 (并查集 + DFS) || (DFS + stack))
- Uva10054 无向图打印任意欧拉回路
- uva10054(欧拉
- 深度优先递归 寻找欧拉回路
- 欧拉回路(混合图的欧拉回路)
- HDU 1878 欧拉回路(判断欧拉回路)
- HDU1878欧拉回路(欧拉回路的判定)
- hdoj--5526--欧拉回路(欧拉回路)
- HDU 1878 欧拉回路(欧拉回路)
- java项目报错
- [Idea]idea常用设置(长期更新)
- uber log 使用
- session对象
- MySQL性能优化经验
- uva10054(递归+欧拉回路)
- php如何比较两个数组是否相等???
- js、css 更新缓存
- SQlite3软件的安装方法说明(附打包资源)
- 关于Android的.so文件你所需要知道的
- idea中遇到问题解决办法
- 最小二乘法与梯度下降法有哪些区别?
- Sping-Boot 单元测试
- python-对象、私有属性_方法、继承(多重继承)、重写