七桥问题--欧拉(算法竞赛入门经典)
一 七桥问题的结论:
如果一个图是连通(无向图)的,且最多只有两个奇点(奇点数目为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 |
下面我们看看本题程序执行结果:
由结果可见我们的路径输出是逆序的。