热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HDU3018AntTrip(欧拉回路)

AntTripTimeLimit:20001000MS(JavaOthers)MemoryLimit:3276832768K(JavaOthers)TotalS

Ant Trip

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 904    Accepted Submission(s): 338


Problem Description
Ant Country consist of N towns.There are M roads connecting the towns.

Ant Tony,together with his friends,wants to go through every part of the country. 

They intend to visit every road , and every road must be visited for exact one time.However,it may be a mission impossible for only one group of people.So they are trying to divide all the people into several groups,and each may start at different town.Now tony wants to know what is the least groups of ants that needs to form to achieve their goal.
 

 

Input
Input contains multiple cases.Test cases are separated by several blank lines. Each test case starts with two integer N(1<=N<=100000),M(0<=M<=200000),indicating that there are N towns and M roads in Ant Country.Followed by M lines,each line contains two integers a,b,(1<=a,b<=N) indicating that there is a road connecting town a and town b.No two roads will be the same,and there is no road connecting the same town.
 

 

Output
For each test case ,output the least groups that needs to form to achieve their goal.
 

 

Sample Input
3 3 1 2 2 3 1 3 4 2 1 2 3 4
 

 

Sample Output
1 2
Hint
New ~~~ Notice: if there are no road connecting one town ,tony may forget about the town. In sample 1,tony and his friends just form one group,they can start at either town 1,2,or 3. In sample 2,tony and his friends must form two group.
 

 

Source
2009 Multi-University Training Contest 12 - Host by FZU
 

 

Recommend
gaojie
 

题意:每条边过且只过一次,问至少要画几笔才能全部边都经过。。孤立的点忽视。

 

分析:首先,你用笔来画的话,只可能有2种,一:每回路,a——>b  二:形成回路,a——>...——>a

 

对于图中的每一块,度数数为奇数的点必须是由第一种画出来的,所以奇数/2就是画的笔数

由两种结合而成的图,也只是奇数/2

特别的,如果图只有第二种的话,即该块中不存在奇数点,则只要画一笔

 

对于整副图(每一块块组合而成),等于 :第一块奇数点/2+第二块奇数点/2+.......,最后得,图的总奇数点/2

 

接着还要计算有多少块里不存在奇数点(不存在奇数点的那块中,一定没有第一种画法,只需要画一笔),累加起来就得到答案了。。

 

如果是个欧拉回路一笔就可以完成,如果是个其它连通集,要根据这个集合的奇度数而定,笔划数=奇度数/2,用并查集来判断有多少个连通集,然后用vector来存这些连通集,通过判断度数是奇偶性来确定是否为欧拉回路;总之笔划数 = 奇度数/2 + 欧拉回路数;

  1. /* 一笔画问题: 每条边过且只过一次,问至少要画几笔才能全部边都经过(不考虑鼓励的点)  
  2.    图有多个集合构成  集合有两种  
  3.    一种为含奇数点的  一种为只含偶数点的 
  4.    对于含奇数点的     笔画数=奇数点个数/2  
  5.    对于只含偶数点的   存在欧拉回路  笔画数=1 
  6.    对于整张图  则  ans=总奇数点/2+只含偶数点的集合个数 
  7. */ 
#include
#include
#include
#include

using namespace std;

const int N=100010;

int n,m;
int father[N],deg[N],odd[N],vis[N];
vector<int> vt;

void makeSet(){
    for(int i=1;i<=n;i++)
        father[i]=i;
}

int findSet(int x){
    if(x!=father[x]){
        father[x]=findSet(father[x]);
    }
    return father[x];
}

int main(){

    //freopen("input.txt","r",stdin);

    while(~scanf("%d%d",&n,&m)){
        vt.clear();
        memset(vis,0,sizeof(vis));
        memset(deg,0,sizeof(deg));
        memset(odd,0,sizeof(odd));
        makeSet();
        int x,y;
        while(m--){
            scanf("%d%d",&x,&y);
            deg[x]++;
            deg[y]++;
            int fx=findSet(x);
            int fy=findSet(y);
            if(fx!=fy)
                father[fx]=fy;
        }
        for(int i=1;i<=n;i++){
            int fi=findSet(i);
            if(!vis[fi]){
                vt.push_back(fi);   //vt保存着集合,集合就是图 
                vis[fi]=1;
            }
            if(deg[i]%2==1)
                odd[fi]++;  //保存这个集合的奇数度数的个数 
        }
        int ans=0;
        for(int i=0;i<(int)vt.size();i++){
            int tmp=vt[i];
            if(deg[tmp]==0) //孤立点 
                continue;
            if(odd[tmp]==0) //该集合是欧拉回路,有一条路
                ans++;
            else
                ans+=odd[tmp]/2;
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

 


推荐阅读
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 深入理解Shell脚本编程
    本文详细介绍了Shell脚本编程的基础概念、语法结构及其在操作系统中的应用。通过具体的示例代码,帮助读者掌握如何编写和执行Shell脚本。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球 Tetris 高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
  • 本文介绍了如何使用Java中的同步方法和同步代码块来实现两个线程的交替打印。一个线程负责打印1到52的数字,另一个线程负责打印A到Z的字母,确保输出顺序为12A34B...5152Z。 ... [详细]
  • HBase运维工具全解析
    本文深入探讨了HBase常用的运维工具,详细介绍了每种工具的功能、使用场景及操作示例。对于HBase的开发人员和运维工程师来说,这些工具是日常管理和故障排查的重要手段。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
author-avatar
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有