zju2008欧拉回路

来源:互联网 发布:传奇盛世翅膀数据7到8 编辑:程序博客网 时间:2024/05/03 02:25
欧拉回路:①不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路
            ②无向图欧拉判定的充要条件是:1)每个点的度数为偶数,2)图是连通的

   http://acm.hdu.edu.cn/showproblem.php?pid=1878

浙大计算机研究生复试上机考试-2008年

#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开始做一次遍历来标记visitif ( isOuShu() && connect() )      //所有节点的度是偶数  而且连通  {printf("1\n");}else{printf("0\n");}}return 0;}


原创粉丝点击