问题:
构造出一条k个节点的有向完全图的欧拉回路。结点编号为1,2,3…k。(k>1)
定义:
给定无孤立结点的图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路;若存在一条回路,经过图中每边一次且仅一次,改回路称为欧拉回路。
具有欧拉回路的图称作欧拉图。
相关定理及推论:
1.无向图G具有一条欧拉路,当且仅当G是连通的,且有零个或两个奇数度结点。
2.无向图G具有一条欧拉回路,当且仅当G是连通的,并且所有结点的度数全为偶数。
3.有向图G具有一条单向欧拉回路,当且仅当G是连通的,且每个节点入度等于出度。
4.有向图G具有一条欧拉路,当且仅当G是连通的,而且除两个结点外,每个结点的入度等于出度,这两个结点中,一个结点的入度比出度大1,另一个结点的入度比出度小1。
构造方法:
由定理3可得:有向完全图必然存在欧拉回路。
对于k个结点的有向完全图,可以从1号结点出发走到k号结点,
然后遍历2-(k-1)号结点,每次从k号结点走到该结点,然后再返回k号结点。
最后从k号结点出发走到1号结点。
剩下的未经过的边恰好就是k-1个节点的有向完全图,递归执行该过程即可。
void getou(vector<int>&q,int k)///获取k个节点的有向完全图的欧拉回路,默认起始点为1,如果有自环加上注释即可。
{
if(k==1)
{
//q.push_back(1);
return ;
}
q.push_back(k);
for(int i=2;i<k;i++)
{
q.push_back(i);
q.push_back(k);
}
//q.push_back(k);
q.push_back(1);
getou(q,k-1);
}