NOJ--1064--用STL来实现半欧拉图的判断

顺便当作介绍 最萌Oj---nbut

这应该算我的第一篇 写题目 主要好累 不想做新题目 而且这题也是蛮有价值的

戳我

好吧  个人还是更喜欢苹果 对棒子的产品无爱 ----话外音

题目大意:就是每一行 给你一条线段的2个点 它的2个端点由4个数字 即x y  x1 y1来表示

一共给你N行 我们就来判断下能不能用一笔画完成

它相比于以往 我遇见过的欧拉问题  只是麻烦在 需要用一个结构体来存储点的坐标  这也应该是这题的难点了

起初 我想用一个hash映射来完成 这样就会省事很多 ..... but fail

就简单的说下思路  就是随机选择一个点开始遍历与它相邻的点 如果未被访问过 就再以这个点为始点遍历与它相邻的顶点 直到所有可以遍历到的顶点
都访问为止

然后 我们判断下 我们dfs遍历到的顶点是否与所有的顶点个数相同 或者 所有顶点个数是否都被标记过   嗯 
这是2种不同的实现 但是相同的思想 都是为了判断连通性

本题 我采用了前者最后  我通过奇度顶点的个数来判断 0个-欧拉图  2个--半欧拉图

 1 #include <iostream>
2 #include <vector>
3 #include <algorithm>
4 #include <map>
5 #include <set>
6 using namespace std;
7
8 struct point
9 {
10 int x, y;
11 point(int a, int b)
12 {
13 x = a;
14 y = b;
15 }
16 bool operator<(const point& other) const
17 {
18 return x < other.x || x == other.x && y < other.y;
19 }
20 };
21
22 void eular(const point& now, set<point>& vis, map<point, vector<point> >& m)
23 {
24 vis.insert(now);
25 vector<point>::iterator it;
26 for (it = m[now].begin(); it != m[now].end(); it++)
27 {
28 if (vis.find(*it)==vis.end())
29 {
30 eular(*it, vis, m);
31 }
32 }
33 }
34
35 int main()
36 {
37 int flag;
38 int a, b, c, d;
39 int n, i;
40 while (scanf("%d", &n)==1)
41 {
42 point p(0, 0), q(0, 0);
43 map<point, vector<point> > m;
44 for (i = 0; i<n; i++)
45 {
46 scanf("%d %d %d %d", &a, &b, &c, &d);
47 p = point(a, b);
48 q = point(c, d);
49 m[p].push_back(q);
50 m[q].push_back(p);
51 }
52 set<point> vis;
53 eular(p, vis, m);
54 flag = 0;
55 if (vis.size() != m.size())
56 {
57 flag = 10;
58 } else
59 {
60 for (map<point, vector<point> > ::iterator it = m.begin(); it != m.end(); it++)
61 {
62 if (it->second.size() % 2 != 0)
63 {
64 flag++;
65 }
66 }
67 }
68 printf("%s\n", (flag == 2 || flag == 0) ? "YES" : "NO");
69 }
70 return 0;
71 }

其实 这里还有很多细节 类似于map使用iterator遍历 必须 自定义<运算符   而且由于map的key值是不能被改变的
所以必须用const

以上 就是某个大神唯一告诉我的了....

NOJ--1064--用STL来实现半欧拉图的判断

时间: 2024-10-08 02:02:01

NOJ--1064--用STL来实现半欧拉图的判断的相关文章

POJ 1386 Play on Words(欧拉图的判断)

Play on Words Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11838   Accepted: 4048 Description Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve it to open that doors. Because ther

Noj 1064 快速排序

快速排序 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KB 比赛描述 给定输入排序元素数目n和相应的n个元素,写出程序,利用内排序算法中快速排序算法进行排序,并输出排序最后结果的相应序列. 输入 共两行,第一行给出排序元素数目n,第二行给出n个元素,1≤n≤100000,每个元素值范围为 [0,100000) 输出 一行,输出排序结果. 样例输入 748 36 68 72 12 48 2 样例输出 2 12 36 48 48 

欧拉图详解

欧拉图详解 通过图(无向图或有向图)中所有边一次且仅一次行遍图中所有顶点的通路称为欧拉通路,通过图中所有边一次且仅一次行遍所有顶点的回路称为欧拉回路.具有欧拉回路的图称为欧拉图(Euler Graph),具有欧拉通路而无欧拉回路的图称为半欧拉图. 1 定义 欧拉通路(Euler tour)--通过图中每条边一次且仅一次,并且过每一顶点的通路. 欧拉回路 (Eulercircuit)--通过图中每条边一次且仅一次,并且过每一顶点的回路. 2 无向图是否具有欧拉通路或回路的判定 G有欧拉通路的充分必

欧拉图简述---(一笔画问题)

主要参考大佬博客:https://blog.csdn.net/u011815404/article/details/86590498 欧拉图 欧拉图是在大家小学时学奥数都学习过的一个类型的题,无论你学得好不好,你都听过它的另外一个名字:一笔画问题: 一,首先来定义一下: 1.欧拉回路:图G的一个回路,如果恰通过图G的每一条边,则该回路称为欧拉回路,具有欧拉回路的图称为欧拉图.欧拉图就是从图上的一点出发,经过所有边且只能经过一次,最终回到起点的路径. 2.欧拉通路:即可以不回到起点,但是必须经过每

(转载)STL map与Boost unordered_map的比较

原链接:传送门 今天看到 boost::unordered_map,它与 stl::map的区别就是,stl::map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合适的位置插入到树中.所以,如果对map进行遍历(中序遍历)的话,输出的结果是有序的.顺序就是按照operator< 定义的大小排序.而boost::unordered_map是计算元素的Hash值,根据Hash值判断元素是否相同.所以,对unordered_map进行遍历,结果是无序的. 用法的区别就是

半糖iOS版首页实现与基本原理揭秘

很久以前,一个学弟的曾问过我如何实现半糖iOS版本首页效果,我当时一看觉得这个效果挺酷炫,然后去github上搜了一下,很多自称是仿半糖首页的,我下载之后发现其实很多代码都没有实现主要的代码.有些代码也做了一些简单的尝试,但是最后都放弃了,所以说这个效果还是没有很好的实现.我于是打算研究一下这个有趣的效果,经过工作之余一段时间的研究.有时候路上也会想一想,做了很多的尝试,一点一点的把遇到的问题解决了.于是写下这篇文章,把自己的一些尝试和想法与大家分享. 有的开发者可能会觉得这么简单的东西别拿来忽

STL视频_01

ZC:这里视频里面有一个调试小技巧,VS08/VS2010开始,控制台程序会自动退出(不像VC6),那么可以在 函数退出的最后一句语句上设置断点,然后查看控制台打印出来的信息.ZC:这一讲,给我的感觉是,用string的好处就是 字符串操作时 索引越界的事情可以不用考虑了(如 复制/删除 等操作) [01:05]这一讲,主要讲解如下要点:一.什么事STL,使用STL的好处:二.STL的string类型的使用方法. [01:25]STL的简介 标准模板库 [01:45]STL的代码,广义上来讲,分

stl学习记录

Effective STL 中文版学习记录 条款4 判断容器是否为空 使用empty而不是size().size()操作在实现上不是一个时间常数操作条款5 尽量使用区间成员函数代替它们的单元素兄弟.STL实现中,区间范围显示比单个循环操作更优化 条款7:当使用new得指针的容器时,记得在销毁容器前delete那些指针vc2008下 运行代码 可以看到 该程序内存不断增加// 1111111.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" #incl

(转)STL map与Boost unordered_map

转:http://blog.csdn.net/orzlzro/article/details/7099231 今天看到 boost::unordered_map, 它与 stl::map的区别就是,stl::map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合适的位置插入到树中.所以,如果对map进行遍历(中序遍历)的话,输出的结果是有序的.顺序就是按照operator< 定义的大小排序. 而boost::unordered_map是计算元素的Hash值,根据Ha