[置顶] hdu3018解题报告--也是白话几笔画学习总结
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解题报告--也是白话几笔画学习总结的更多相关文章
- [置顶] 白话最小边覆盖总结--附加 hdu1151结题报告
刚开始看到这个题目的时候就觉得想法很明了,就是不知道如何去匹配... 去网上看了不少人的解题报告,但是对于刚接触“最小边覆盖”的我来说....还是很困难滴....于是自己又开始一如以往学习“最大独立集 ...
- [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总
本文出自 http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner 打开 这个专题一共有25题,刷完 ...
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode206 反转链表,内含7种语言答案
206.反转链表 1.题目描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1-> ...
- Facebook Hacker Cup 2014 Qualification Round 竞赛试题 Square Detector 解题报告
Facebook Hacker Cup 2014 Qualification Round比赛Square Detector题的解题报告.单击这里打开题目链接(国内访问需要那个,你懂的). 原题如下: ...
- 北邮新生排位赛1解题报告d-e
话说cdsn要是前面插入源代码又什么都不放就会出现奇怪的源代码?不知道是哪个网页的 407. BLOCKS 时间限制 1000 ms 内存限制 65536 KB 题目描述 给定一个N∗M的矩阵,求问里 ...
- POJ 1001 解题报告 高精度大整数乘法模版
题目是POJ1001 Exponentiation 虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...
- 10.30 NFLS-NOIP模拟赛 解题报告
总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...
- 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 ...
- USACO Section1.3 Combination Lock 解题报告
combo解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
随机推荐
- 【Untiy3D 游戏开发之一】Unity3D For Window/Mac最新4.2.0版本破解教程
转载请标明:转载自[小枫栏目],博文链接:http://blog.csdn.net/rexuefengye/article/details/11646885 一.Unity3D For Mac 1.首 ...
- c++ cout 保留小数点位
需要头文件 <iomanip> 输出时需要用 fixed 和 setprecision() fixed代表输出浮点数,setprecision()设置精度. #include <io ...
- Clojure绘制UML
简单介绍 使用Clojure封装了Graphviz的使用.眼下主要实现了UML的绘制 使用 以命令模式的UML为例,演示cdraw的使用 安装Graphviz cdraw是对Graphviz的简单封装 ...
- config -导航
在config进行中配置 1在config中添加SITmap <siteMap enabled="true" defaultProvider="UserSiteM ...
- ubuntu14.04LTS ruby on rails 开发环境
小弟初学 Ruby,也没用过Linux. 在网上搜了好多关于开发环境的配置的文章,但总是和实际有点出入,找了N遍文章后,终于找到最简环境安装配置方法,分享下 推荐用 Ubuntu,感觉对于习惯用Win ...
- 学习validate
jQuery Validate (转自http://www.w3cschool.cc/jquery/jquery-plugin-validate.html?utm_source=tuicool) jQ ...
- python中decorator
先讲一下python中的@符号 看下面代码 @f @f2 def fun(args, args2, args3, args4, ……): pass 上面代码相当于 def fun(args, args ...
- BZOJ 1782: [Usaco2010 Feb]slowdown 慢慢游( BIT + dfs )
orz...hzwer 对着大神的 code 看 , 稍微理解了. 考虑一只牛到达 , 那它所在子树全部 +1 , 可以用BIT维护 --------------------------------- ...
- Linux 网络编程: gethostbyname( ), getservbyname( )
前言 最近在学习网络编程,用到几个应该比较常用的网络编程函数,所以写篇博客来记录一下,毕竟学得快忘得也快.国庆节在宿舍写着博客看着各个景点人山人海倒也快哉~ gethostbyname( ) 这个函数 ...
- XPath与多线程爬虫
XPath是一门在xml中查询信息的语言安装使用XPath 1.安装lxml库 window:pip install lxmllinux:sudo pip install lxml国内安装缓慢,建议到 ...