欧拉回路:①不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路
②无向图欧拉判定的充要条件是:1)每个点的度数为偶数,2)图是连通的
②无向图欧拉判定的充要条件是:1)每个点的度数为偶数,2)图是连通的
http://acm.hdu.edu.cn/showproblem.php?pid=1878
#include <stdio.h>
#include <string.h>
bool graph[1000][1000]; //邻接矩阵保存图
int degree[1000]; //结点度数
bool visit[1000]; //一次遍历后,结点是否访问过(访问过true)
int n,m;
void DFS(int t) //从结点t开始做深度遍历,遍历到的结点修改visit标记已访问过
{
visit[t]=true;
for (int i=1;i<=n;i++) //从1到n,搜索1的邻接点x,再对其DFS(x)
{
if ( graph[t][i] && visit[i]==false ) //边存在,未访问过(所有点只能访问一次)
{
DFS(i);
}
}
}
bool connect()
{
for (int i=1;i<n;i++)
{
if (visit[i]==false) //一次DFS后,仍有未访问的点则不连通
{
return false;
}
}
return true;
}
bool isOuShu() //判断结点度是否是偶数
{
for (int i=1;i<n;i++)
{
if (degree[i]%2!=0)
{
return false;
}
}
return true;
}
int main()
{
int i,a,b;
while (scanf("%d",&n)!=EOF && n!=0) //输入n=0就会退出,所以n,m分别输入
{
scanf("%d",&m);
memset(graph,0,sizeof(graph)); //重点易忘:初始化清0!!!
memset(degree,0,sizeof(degree));
memset(visit,0,sizeof(visit));
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
graph[a][b]=graph[b][a]=true; //无向图
degree[a]++;
degree[b]++;
}
DFS(1); //从1开始做一次遍历来标记visit
if ( isOuShu() && connect() ) //所有节点的度是偶数 而且连通
{
printf("1\n");
}
else
{
printf("0\n");
}
}
return 0;
}