1.题意 2.分析难点(结合图形)

1.首先说说题意吧...题意很简单...但是一开始很菜的我就很迷惑..在想啊...题目怎么就会有没有连接边的点呢....因为你每次给出一条边..就把 a,b连接啦...所有...所有的城市最少都有一条边......(不知道有没有和我一样的人...)此处省略反省1W字........题目的城市是从1到N标记,比如有5个城市,两条街:1--2、3---4,那么 城市5就是不要考虑的.....

很明确...这就是求几笔画问题....很菜的我刚刚学习了欧拉回路....对于刚刚接触的我来说....不知道从哪里下手....于是...百度.....了解了一个联通图的:笔画次数=奇度顶点数/2;如果这个图没有奇度顶点,就可以一笔画.....

2.对于很菜的我来说难点就在于....如果N个城市,分成不同的“块”(就是不和别的连在一起、单独的一块城市),比如下图:

对于案例1分为了3个块,案例2分为了2个块,而且...对于案例1中的5号....我们要忽略,菜菜的我就会根据并査集判断一个图是否连通,然后对于连通的根据欧拉路的一些性质看看这个连通的图是不是欧拉路(之前发表过白话欧拉路径与欧拉回路),于是纠结了一下午...参考了一点点别人的代码....这里给出自己详细的理解、分析过程:

我们的目标是:(没蛀牙,小小玩笑)目标是求每个块中的 奇度点数/2,然后把所有块的这个奇度点数/2 加起来就是总共要几笔画;

1.我们有一个记录度的数组degree[MAX]..(不分入度和出度),案例输入之初赋值为0,案例每次输入a,b就degree[a]++,degree[b]++;那么我们可以知道,,从1到N,度为0的点,就是我们不要考虑的...那么

2.我们要考虑怎么分成不同的”块“,我们可以知道,对于每一个块...用并査集在输入的时候处理,那么,每一个块,就有一个祖先boss,我们就可以根据boss来分块,用一个flag[MAX],flag[i]表示以 i 为boss的这个块奇度点个数(因为我们要根据这个块来计算:笔画次数=奇度顶点数/2),因为我们在并査集操作过程中不确定会把谁作为祖先,那么数组大小开MAX,初始化为-1,然后我们从1到N每个点 i 找到祖先 x,如果flag[x]是-1,意思就是x第一次作为boss,并且在degree[i]不为0(为0就是要忽略的)的情况下吧flag[x]=0,然后我们在判断:如果degree[i]%2是不是0(奇度判断),决定flag[x]是不是要++一次(如果是奇度点,以x为boss的块中就多了一个奇度点);

3.最后再从1到N计算一次笔画就可以啦...

上马:

// 46MS 1400K
#include<stdio.h>
#include<string.h> #define MAX 100005 int N,M;
int father[MAX];
int degree[MAX];
int flag[MAX]; int find(int a)
{
if(a!=father[a])
father[a]=find(father[a]);
return father[a];
} void init()
{
int i;
for(i=1;i<=N;i++) father[i]=i//,degree[i]=0,flag[i]=-1;
memset(degree,0,sizeof(degree));memset(flag,-1,sizeof(flag));//事实证明memset比for从1到N初始快 int a,b;
for(i=0;i<M;i++)
{
scanf("%d%d",&a,&b);
degree[a]++;degree[b]++;
father[find(a)]=find(b);//合并
}
} void work()
{
int i;
for(i=1;i<=N;i++)
{
int x=find(i);
if(flag[x] == -1 && degree[i]!=0)
flag[x]=0;
if(degree[i]%2 != 0)
flag[x]++;
}
int ans=0;
for(i=1;i<=N;i++)
if(flag[i]!=-1)
{
if(flag[i]==0) ans++;//|| flag[i]%2==0
else ans+=flag[i]/2;
}
printf("%d\n",ans);
} int main()
{
while(~scanf("%d%d",&N,&M))
{
init();
work();
}
return 0;
}
/*
5 3
1 2
1 3
1 4
*/

个人愚昧观点..欢迎指正,欢迎讨论...

[置顶] hdu3018解题报告--也是白话几笔画学习总结的更多相关文章

  1. [置顶] 白话最小边覆盖总结--附加 hdu1151结题报告

    刚开始看到这个题目的时候就觉得想法很明了,就是不知道如何去匹配... 去网上看了不少人的解题报告,但是对于刚接触“最小边覆盖”的我来说....还是很困难滴....于是自己又开始一如以往学习“最大独立集 ...

  2. [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总

    本文出自   http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner  打开 这个专题一共有25题,刷完 ...

  3. 2021字节跳动校招秋招算法面试真题解题报告--leetcode206 反转链表,内含7种语言答案

    206.反转链表 1.题目描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1-> ...

  4. Facebook Hacker Cup 2014 Qualification Round 竞赛试题 Square Detector 解题报告

    Facebook Hacker Cup 2014 Qualification Round比赛Square Detector题的解题报告.单击这里打开题目链接(国内访问需要那个,你懂的). 原题如下: ...

  5. 北邮新生排位赛1解题报告d-e

    话说cdsn要是前面插入源代码又什么都不放就会出现奇怪的源代码?不知道是哪个网页的 407. BLOCKS 时间限制 1000 ms 内存限制 65536 KB 题目描述 给定一个N∗M的矩阵,求问里 ...

  6. POJ 1001 解题报告 高精度大整数乘法模版

    题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...

  7. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  8. LeetCode解题报告—— Reverse Nodes in k-Group && Sudoku Solver

    1. Reverse Nodes in k-Group Given a linked list, reverse the nodes of a linked list k at a time and ...

  9. USACO Section1.3 Combination Lock 解题报告

    combo解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

随机推荐

  1. java循环HashMap两种方法的效率比较

    一.循环HashMap的两种方式 方式1: Iterator<Entry<String, String>> entryKeyIterator = entrySetMap.ent ...

  2. Pain for friend

    For a guy who has experienced his fair share of mysteries,on mystery,I still can't figure out is why ...

  3. 关于我们_ | 腕表时代watchtimes.com.cn

    关于我们_ | 腕表时代watchtimes.com.cn 关于我们         腕表时代是北京兰会时光科技有限公司旗下运营的手表网站.腕表时代于2013年5月17日正式上线.秉承专业.生动.实用 ...

  4. ZYB's Game(博弈)

    ZYB's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  5. 学习日记之模板方法模式和 Effective C++

    模板方法模式: 定义:定义一个操作中的算法的骨架.而将一些步骤延伸到子类中.模板方法使得子类能够不改变算法的结构就可以重定义该算法的某些特定步骤. (1),用了继承,而且肯定这个继承有意义的情况下.就 ...

  6. Android API 中文(77)——AdapterView.OnItemSelectedListener

    前言 本章内容是android.widget.AdapterView.OnItemSelectedListener,版本为Android 2.3 r1,翻译来自"cnmahj",欢 ...

  7. Linux常用命令总结——文件管理

    Linux中的目录 路径:也就是linux中的目录(文件夹)有绝对路径和相对路径 根目录:/ 用户主目录(home directory):位于/home目录下,用户登录时 工作目录(working d ...

  8. asp.NET配置

    添加用户 1.选择创建用户   2 可以使用网站管理工具来管理应用程序的所有安全设置.可以设置用户和密码(身份验证),可以创建角色(用户组),还可以创建权限(用于控制对应用程序各个部分的访问的规则). ...

  9. Ext JS学习第十六天 事件机制event(一)

    此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件,相信你一定不陌生, 基本事件是什么?就类似于click.keypress.focus. ...

  10. 简单的前端js+ajax 购物车框架(入门篇)

    其实,一直想把自己写的一些js给总结下,也许是能力有限不能把它完美结合起来.只能自己默默的看着哪些代码,无能为力. 今天在公司实在没有事做,突然就想到写下商城的购物车的前端框架,当然我这里只有购物车的 ...