[置顶] 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 博客园(转载请注明出处)---------------------------------------------------------------- ...
随机推荐
- APUE学习之---------------进程
离职了,交接期也有足够的时间了,可以在好好的再看一下APUE,想想上次详细的看还是在两年之前,虽然中间也偶尔会翻出来看看,但是由于工作上交集相对比较少一直没有去细读一下.现在正好是一段空挡期可以好好看 ...
- python Unicode转ascii码的一种方法
缘起 看到这样的数据:Marek Čech.Beniardá怎样变成相对应的ascii码呢 解决 import unicodedata s = u"Marek Čech" #(u表 ...
- JAVA 创建TXT文件,写入文件内容,读取文件内容
[java] view plain copy package com.abin.facade.ws.mail.function; import java.io.BufferedReader; i ...
- 用户登录session_id观看
通过使用浏览器firefox或者google看cookie id, 这样就知道登录状态怎么样了
- Java thread中对异常的处理策略
转载:http://shmilyaw-hotmail-com.iteye.com/blog/1881302 前言 想讨论这个话题有一段时间了.记得几年前的时候去面试,有人就问过我一个类似的问题.就是j ...
- iOS中解析json多种方法
我感觉JSON解析,重要的是JSON解析之后对结果的处理JSON解析后是个dictionary,但是字典中有可能包含字典和数组,数组中还可以包含字典.向客户端请求的返回数据解析下面就简单介绍一下JSO ...
- [C#参考]委托机制
1. 委托概述 这是一个新的概念,但是其本质并不是什么新鲜的事物,委托本质上就是一个类.只不过一般的类是数据的集合,委托保存的是一个或者多个方法.委托是引用类型,因此委托有引用和对象,同时委托对象中包 ...
- Java基础之编程语法(二)
1.常量: 整型:整数,4个字节. 长整型:整数,8个字节.以L结尾. 单精度浮点数:小数,4个字节.以F结尾. 双精度浮点数:小数,8个字节. 布尔:只有两个值,真(true)或假(false),1 ...
- [置顶] P2P之我见,关于打洞的学问-------开篇
最近忙项目,有点累,无暇顾急博客,4月份本来想写写流媒体的文章,结果回家休了两个月回深圳后,接了P2P的项目,那就开始P2P吧. P2P起源于美国大学生Shawn Fanning 写的一个分享软件Na ...
- JS拖动DIV布局
方法一: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...