第一行国际惯例——咕咕咕。
第二行——你还差的远呢。
本篇博客只针对无向图(我还没做过有向图的题
首先是两个定义(欧拉回路和欧拉路径
欧拉回路:每条边恰好只走一次,并能回到出发点的路径
欧拉路径:经过每一条边一次,但是不要求回到起始点
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
