前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[牛客]浙江大学计算机考研复试题目 - 欧拉回路

[牛客]浙江大学计算机考研复试题目 - 欧拉回路

作者头像
Kindear
发布2020-04-08 17:32:55
6900
发布2020-04-08 17:32:55
举报

浙江大学考研复试题目 - 欧拉回路

题目描述

欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?

输入描述:
    测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。
输出描述:
    每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。

示例1

输入

[复制](javascript:void(0)?

3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
输出

[复制](javascript:void(0)?

1
0
解题报告
判断欧拉回路的方法:
无向图存在欧拉回路的充要条件
一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
有向图存在欧拉回路的充要条件
一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。

1.连通判断 - 并查集/dfs/bfs
2.度数判断 
tips
本题要求存在欧拉回路,并不是要求全部的点都连通,只需要连通的图构成欧拉回路即可。
#include <bits/stdc++.h>
#define maxn 1010
using namespace std;
int N,M; //
int maps[maxn][maxn];
int father[maxn];
int du[maxn];
int findfather(int x)
{
    return x==father[x]?x:findfather(father[x]);
}
bool combine(int x,int y)
{

    int fx = findfather(x);
    int fy = findfather(y);
    if(fx == fy)
     return false;
    else
    {
        if(fx<fy)
        {
            father[y] = fx;
        }
        else
        {
            father[x] = fy;
        }
    }
    return true;
}
int counts() //并查集判断连通
{
    int ans = 0;
    for(int i=1;i<=N;i++)
        if(father[i] == i) ans++;
    return ans;
}
bool judgeDu(int n)
{
    for(int i=1;i<=n;i++)
    {
        if(du[i]%2!=0)
            return false;
    }
    return true;
}
int main()
{
    ios::sync_with_stdio(false);
    while(~scanf("%d",&N)&&N!=0)
    {
        if(N==0) break;
        scanf("%d",&M);
        for(int i=1;i<=N;i++) father[i] = i;
        memset(maps,0,sizeof(maps));
        memset(du,0,sizeof(du));
        int px,py;
        for(int j=0;j<M;j++)
        {
            scanf("%d %d",&px,&py);
            du[px]++;
            du[py]++;
            combine(px,py);
        }
        int onlypoint = 0;
        //度为 0 的就是孤立节点
        for(int i=1;i<=N;i++)
        {
            if(du[i] == 0)
            {
                onlypoint++;
            }
        }
        if(counts()-onlypoint == 1 && judgeDu(N)){
            printf("1\n");
        }else
        {
            printf("0\n");
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 浙江大学考研复试题目 - 欧拉回路
    • 题目描述
      • 输入描述:
        • 输出描述:
          • 输入
            • 输出
              • 解题报告
                • tips
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档