(1) 什么是欧拉路径和欧拉回路
简单说:一笔画问题就是欧拉路径和回路问题,可以一笔(不回笔)把一个图完整的画出来,路径就是欧拉路径,如果这个路径成环,那么就是欧拉回路。【就是要遍历完所有的边】
(2)判断欧拉回路是否存在的方法
有向图:图连通,所有的顶点出度=入度。
无向图:图连通,所有顶点都是偶数度。
(3)涉及图的连通性,图的连通性常用几种算法(个人YY,欢迎补充)
a.DFS
o(n^2)的复杂度
。。。。。。
b.弗洛伊德算法(最短路算法)
o(n^3) 贴一下软设代码。。。。。。
#include <iostream> using namespace std; #define inf 0x3f3f3f3f struct graph { int n,e; int mat[101][101]; }; struct graph C; void setgraph() { int m,n,x; cin >> C.n >> C.e; for(int i=1; i<=C.n; i++) for(int j=1; j<=C.n; j++) C.mat[i][j]= inf; for(int i=1; i<=C.e; i++) { cin >> m >> n >> x; C.mat[m][n]=x; } } void Floyd() { int d[101][101]; for(int i=1; i<=C.n; i++) for(int j=1; j<=C.n; j++) d[i][j]=C.mat[i][j]; for(int k=1; k<=C.n; k++) for(int i=1; i<=C.n; i++) for(int j=1; j<=C.n; j++) d[i][j]=min(d[i][k]+d[k][j],d[i][j]); //floyd for(int i=1; i<=C.n; i++) { for(int j=1; j<=C.n; j++) { if(d[i][j]==inf) cout << "∞" << " "; else cout << d[i][j] << " "; } cout << endl; }//print } int main() { setgraph(); Floyd(); return 0; }
c.并查集
-----------------------------------------------------
- 题目描述:
-
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
- 输入:
-
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。
- 输出:
-
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
- 样例输入:
-
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
- 样例输出:
-
1 0
-----------------------------------------------------------------------
#include <iostream> #include<cstdio> using namespace std; int p[1003],d[1003]; int f(int x) { return p[x]==x?x:p[x]=f(p[x]);//注意这里的p[x]=f(p[x]),再压缩一下,嘿嘿。。。 } int main() { int n,m,a,b,f2,f1; while(scanf("%d",&n)!=EOF&&n) { f2=f1=0; for(int i=0;i<n;i++) { d[i]=0; p[i]=i; } cin >> m; for(int i=0; i<m; i++) { cin >> a >> b; p[f(a--)]=p[f(b--)]; d[a]++; d[b]++; } for(int i=0; i<n; i++) { if(p[i]==i) f1++; if(d[i]%2==1|| d[i]==0) f2++; } if(f1==1&&f2==0) cout << 1 << endl; else cout<< 0 << endl; } return 0; }