欧拉回路(一笔画问题)(无向图)HRBUST1658

it2022-05-05  100

第一行国际惯例——咕咕咕。

第二行——你还差的远呢。

 

本篇博客只针对无向图(我还没做过有向图的题

首先是两个定义(欧拉回路和欧拉路径

欧拉回路:每条边恰好只走一次,并能回到出发点的路径

欧拉路径:经过每一条边一次,但是不要求回到起始点

1.构成欧拉回路的要求:

每个顶点的度数都是偶数,则存在欧拉回路。

2.构成欧拉路径的要求:

除了起始终止两个点度数为奇数,其余顶点的度数都是偶数,则存在欧拉路径。

上面的图都要求为连通图(用并查集判断

 

其实题目大多会问:给你一个图,能不能用一笔画成啊?这样的。

然后,如果不连通的话,有几个不连通就需要几笔。

 

题目链接HRBUST1658

思路:

1.先判断是否联通

2.再判断是否奇点只有2or0个(本题可以为欧拉回路也可以为欧拉路径

3.我还加了个判断重边,不加应该也行吧,数据应该会保证的,我没试

代码

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int f[101]; int tofind(int x) { while(f[x]!=x) x = f[x]; return x; } void liantong(int a,int b) { int r1 = tofind(a); int r2 = tofind(b); if(r1==r2) return; else f[a] = r2; } int main() { int n; scanf("%d",&n); while(n--) { int p,q; int t[101]; bool vis[101][101] = {0}; int tot = 0; memset(t,0,sizeof(t)); scanf("%d%d",&p,&q); for(int i = 1; i <= p; ++i) f[i] = i; for(int i = 0; i < q; ++i) { int a,b; scanf("%d%d",&a,&b); liantong(a,b); if(vis[a][b]==0) { t[a]++; t[b]++; } vis[a][b] = 1; vis[b][a] = 1; } int sum = 0; for(int i = 1; i <= p; ++i) if(f[i] == i) sum++; if(sum>1) { cout<<"No"<<'\n'; continue; } for(int i = 1; i <= p; ++i) { if(t[i]%2==1) tot++; } if(tot == 0||tot == 2) printf("Yes\n"); else printf("No\n"); } return 0; }

 

再附一个题目链接HDU1878

这个就要求必须是欧拉回路,即所有度数全部为偶数。上面的代码略作改动即可。

再补充一个模板题HihoCoder1176

欢迎指出错误qwq


最新回复(0)