对于有向图来说
(欧拉图+半欧拉图):首先图得连通
欧拉图:所有点的出度等于入度;
半欧拉图:只存在两个出度不等于入度的点,并且两个点一定要作为起点和终点,起点条件:出度-入度=1,终点条件是:入度-出度=1;
无向图来说
(欧拉图+半欧拉图):首先图得连通
欧拉图:所有点的度都为偶数;
半欧拉图:只存在两个点的度数为奇数
欧拉图和半欧拉图都属于图的遍历问题,只是这种遍历呢,是基于某种限制的.当然哈密顿图也属于图的遍历问题~
这题是有向图~
输出欧拉路径(半欧拉图得一开始得选择 出度-入度=1的点 ,欧拉图随意选择一点~)
然后这题..首先你是不知道最后形成的图是不是欧拉图,是不是半欧拉图,所以阿判断很重要
(欧拉图+半欧拉图):首先图得连通
欧拉图:所有点的出度等于入度;
半欧拉图:只存在两个出度不等于入度的点,并且两个点一定要作为起点和终点,起点条件:出度-入度=1,终点条件是:入度-出度=1;
无向图来说
(欧拉图+半欧拉图):首先图得连通
欧拉图:所有点的度都为偶数;
半欧拉图:只存在两个点的度数为奇数
欧拉图和半欧拉图都属于图的遍历问题,只是这种遍历呢,是基于某种限制的.当然哈密顿图也属于图的遍历问题~
这题是有向图~
输出欧拉路径(半欧拉图得一开始得选择 出度-入度=1的点 ,欧拉图随意选择一点~)
void dfs(int u){
for(int k = head[u] ; k != -1 ;k = e[k].next){
if(!vis[k]){
vis[k] = 1;
dfs(e[k].to);
path[id++] = k;
}
}
}
然后这题..首先你是不知道最后形成的图是不是欧拉图,是不是半欧拉图,所以阿判断很重要
bool judge(int &s){ //传起点
if(cnt != pn) return false; //pn代表有多少个结点,cnt是连接了多少块结点,判连通
int num = 0,s1 = -1,s2 = -1; //num记录出度不等于入度的点,s1记录起点,s2记录终点
for(int i = 0 ; i < 26 ; i++){
if(out[i] - in[i] == 1) { s1 = i ; }
if(in[i] - out[i] == 1) {s2 = i;}
if(in[i] != out[i]) num++;
}
if(s1 != s2 && s2 != -1 && s1 != -1 && num == 2 ) { s = s1 ; return true; }
if(num == 0) {
for(int i = 0 ; i < 26 ; i++){
if(in[i] != 0){ s = i ;break;}
}
return true;
}
return false;
}