欧拉回路
发布时间
阅读量:
阅读量
问题描述
1.思考什么是欧拉回路 如何判断欧拉回路
2.该题注重的是点与点之间的关系 所以要构建邻接矩阵
3 . 利用函数返回判断结果 打印输出
构建一个类 通过类 构建一个邻接矩阵
const int MaxSize=10;
template <typename DataType>
class MGraph
{
public:
MGraph();
void DFTraverse(int v);//深度优先遍历函数
int isConnected();//判断是否联通
int isEuler();//判断是否为欧拉图
private:
DataType vertex[MaxSize];
int visited[MaxSize];
int edge[MaxSize][MaxSize];//邻接矩阵
int vertexNum,edgeNum;
};
template <typename DataType>
MGraph<DataType>::MGraph()
{
int i,j,k;
cin>>vertexNum>>edgeNum;
for(i=0;i<vertexNum;i++)
visited[i]=0;
for(i=0;i<vertexNum;i++)//邻接矩阵初始化
{
for(j=0;j<vertexNum;j++)
{
edge[i][j]=0;
}
}
for(k=0;k<vertexNum;k++)//邻接矩阵
{
cin>>i>>j;
edge[i-1][j-1]=1;//我的edge是从0下标开始存的 所以要减一
edge[j-1][i-1]=1;
}
}
判断是否含有欧拉通路
1 欧拉回路是联通的
void MGraph<DataType>::DFTraverse(int v)//深度优先遍历
{
visited[v]=1;//用 0 1 来判断是否被访问过
for(int j =0;j<vertexNum;j++)
{
if(edge[v][j]==1&&visited[j]==0)
{
DFTraverse(j);
}
}
}
template <typename DataType>
int MGraph<DataType>::isConnected()
{
DFTraverse(0);//通过深度优先遍历判断是否每个顶点都被访问过
int cn=0;
for(int i=0;i<vertexNum;i++)
{
//cout<<visited[i]<<" ";
if(visited[i]==1)
cn++;
}
//cout<<endl;
//cout<<cn<<endl;
if(cn<vertexNum)
return 0;
return 1;
}
2 每个顶点的度都为偶数
int MGraph<DataType>::isEuler()
{
int degree[vertexNum]={0};//用来存每个点的度
int i,j;
for(i=0;i<vertexNum;i++)
for(j=0;j<vertexNum;j++)
{
if(edge[i][j]>0)
degree[i]++;
}
int flag=1;
for(i=0;i<vertexNum;i++)
{
if(degree[i]%2==1)//判断顶点的度是否都为偶
flag=0;
}
int connected=isConnected();
return connected&&flag;
}
主函数
int main()
{
MGraph<int> g1;
cout<<g1.isEuler()<<endl;
}
在下是一名小白 如果有不恰当的地方 欢迎指正
全部评论 (0)
还没有任何评论哟~
