欧拉回路,欧拉路径
Posted thunder-110
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉回路,欧拉路径相关的知识,希望对你有一定的参考价值。
题意:
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
#include<iostream> #include<cstdio> #include <cctype> #include<algorithm> #include<cstring> #include<cmath> #include<string> #include<cmath> #include<set> #include<vector> #include<stack> #include<queue> #include<map> using namespace std; #define ll long long #define mem(a,x) memset(a,x,sizeof(a)) #define se second #define fi first const ll mod=998244353; const int INF= 0x3f3f3f3f; const int N=2e5+5; int n,m; int du[1005]; int f[1005]; int getf(int x) { if(x!=f[x]) { f[x]=getf(f[x]); } return f[x]; } int main() { int a,b,fa,fb; while(cin>>n && n) { cin>>m; int cnt=0; mem(f,0); mem(du,0); for(int i=0;i<=n;i++) f[i]=i; while(m--) { cin>>a>>b; du[a]++; du[b]++; fa=getf(a); fb=getf(b); if(fa!=fb) { f[fa]=fb; } else cnt++; //如果fa==fb,则两个节点在同一并查集中, //这样的情况有且只能出现一次 ,否则走的路径会存在重复 } if(cnt!=1) { cout<<0<<endl; continue; } int flag=0; for(int i=1;i<=n;i++) { if(du[i]%2!=0){ flag=1; break; } } cout<< (flag? 0:1)<<endl; } }
题意:
求无向图每条边恰好经过两次,在回到原点,输出经过的顶点。容易转化为有向图欧拉回路每条边经过一次。
#include<iostream> #include<cstdio> #include <cctype> #include<algorithm> #include<cstring> #include<cmath> #include<string> #include<cmath> #include<set> #include<vector> #include<stack> #include<queue> #include<map> using namespace std; #define ll long long #define mem(a,x) memset(a,x,sizeof(a)) #define se second #define fi first const ll mod=998244353; const int INF= 0x3f3f3f3f; const int N=2e5+5; int n,m,cnt=0; int ans[200005]; struct edge { int to,flag; edge(int _to,int _flag):to(_to),flag(_flag){} }; vector<edge> v[200005]; void dfs(int x) { for(int i=0;i<v[x].size();i++) { if(v[x][i].flag==0) { v[x][i].flag=1; dfs(v[x][i].to); } } ans[++cnt]=x; } int main() { int a,b; cin>>n>>m; while(m--) { scanf("%d%d",&a,&b); v[a].push_back(edge(b,0)); v[b].push_back(edge(a,0)); } dfs(1); //printf("1 "); for(int i=1;i<=cnt;i++) printf("%d ",ans[i]); return 0; }
以上是关于欧拉回路,欧拉路径的主要内容,如果未能解决你的问题,请参考以下文章