七桥问题--欧拉(算法竞赛入门经典)

一 七桥问题的结论:

如果一个图是连通(无向图)的,且最多只有两个奇点(奇点数目为0或者2)则一定存在欧拉回路。如果有两个奇点,则必须从其中一个奇点出发,另一个奇点终止;如果奇点不存在,则可以在任意点出发,最终一定会回到该点。(路径不能重复)

如果图是有向图,最多只能有两个点的入度不等于出度,而且必须是其中一个点的出度恰好比入度大1(作为起点),另一个点的入度比出度大1(作为终点)。当然必须注意前提条件,那就是图必须连通。

下面贴上ac代码:

 1 #include<iostream>
 2 #include<string.h>
 3 using namespace std;
 4 #define maxn 1000
 5 int g[maxn][maxn],vis[maxn][maxn],n,m;
 6 void uler(int u)
 7 {
 8     for(int v=0;v<n;v++)
 9     if(g[u][v]&&!vis[u][v])
10     {
11         vis[u][v]=vis[v][u]=1;//无向图如此处理,有向图只需要把它改成vis[u][v]=1就行了
12         uler(v);//类似dfs,如果到这里为止,他所有的邻接点都已经被访问。
13         cout<<u<<' '<<v<<endl;
14     }
15 }
16 int main()
17 {
18     cin>>n>>m;
19     memset(g,0,sizeof(g));
20     int u,v;
21     for(int i=0;i<m;i++)
22     {
23         cin>>u>>v;
24         g[u][v]=g[v][u]=1;
25     }
26     uler(1);
27     return 0;
28 
29 }

本代码中输出的路径是按照逆向输出的,因此要输出正向的路径,需要引入栈,把(u,v)压入栈,然后输出。

本题我自己建立了一个样例:

这是本题的原图,我们建立如下的图表存储边的关系

 

0

1

2

0

0

1

1

1

1

0

1

2

1

1

0

下面我们看看本题程序执行结果:

由结果可见我们的路径输出是逆序的。

posted @ 2014-07-24 10:27  future_hero  阅读(3630)  评论(0编辑  收藏  举报