欧拉回路输出

来源:互联网 发布:windows 10桌面美化 编辑:程序博客网 时间:2024/06/05 11:08

欧拉道路

无向图:

连通且最多有2个奇数边的点,则一定存在欧拉道路,是边只能走一遍,点是可以走多次的

如果有2个奇点,必定从其中一个点开始从另外一个点结束。

如果无奇点,则为欧拉回路,任意点出发并回到起始点。

euler(x),的参数x是起点即可。


欧拉回路

有向图:

最多2个点入度不等于出度,且其中一个点的出度比入度大一,另一个点入度比出度大1。

如果有2个点,那么就从这个出度大的开始到入度大的结束


欧拉道路

#include <iostream>#include <string.h>using namespace std;bool map1[105][105];bool used[105][105];int indegree[105];int ourdegree[105]; int m;int euler(int v){for(int i=0;i<=m;i++)if(map1[v][i]&&!used[v][i]){used[v][i]=used[i][v]=1;euler(i);cout << v << " " << i << endl;}}int main(){int maxn=0;freopen("in.txt","r",stdin);memset(map1,0,sizeof(map1));memset(indegree,0,sizeof(indegree));int i,j,k,t1,t2,n;cin >> n >> m;for(i=0;i<m;i++){cin >> t1 >> t2;map1[t1][t2]=1;map1[t2][t1]=1;indegree[t1]++;indegree[t2]++;}for(i=1;i<=n;i++){if(indegree[i]%2==1)maxn++;}if(maxn>2)cout << "无欧拉路" << endl;elseeuler(1);return 0;}

欧拉回路

输入的点要求是起点。

输出结果是逆序的。

#include <iostream>#include <string.h>using namespace std;bool map1[105][105];bool used[105][105];int indegree[105];int outdegree[105];int m;int euler(int v){for(int i=0;i<=m;i++)if(map1[v][i]&&!used[v][i]){used[v][i]=used[i][v]=1;euler(i);cout << v << " " << i << endl;}}int main(){int maxn=0;freopen("in.txt","r",stdin);memset(map1,0,sizeof(map1));memset(indegree,0,sizeof(indegree));memset(outdegree,0,sizeof(outdegree));int i,j,k,t1,t2,n;cin >> n >> m;for(i=0;i<m;i++){cin >> t1 >> t2;map1[t1][t2]=1;outdegree[t1]++;indegree[t2]++;}int u=0;int v=0;maxn=0;for(i=1;i<=n;i++){if(indegree[i]!=outdegree[i]){            maxn++;            if(outdegree[i]>indegree[i])v=i;}}v=max(1,v);if(maxn>2)cout << "no" << endl;else{euler(v);}return 0;}


0 0
原创粉丝点击