摘要: 先来区分几个概念: 图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。 具有欧拉回路的图称为欧拉图(简称E图)。 欧拉回路的判断 一下判断基于此图的基图连通。无向图存在欧拉回路条件 一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数。有向图存在欧拉回路条件 一个有向图存在欧拉回路,且所有顶点的入度等于出度汉密尔顿定义:给定图G,若存在一条路经过图中的每个结点恰好一次,这条路称作汉密尔顿路。若存在一条回路,经过图中的每个结点恰好一次,这条回路称作汉密尔顿回路。汉密尔顿回路的判定,目前主流的就是用dfs了,此题刚好作为一个例子 ,无向图.View Cod... 阅读全文
posted @ 2012-03-25 15:46 我们一直在努力 阅读(451) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1106本题题意就是看能否把一群人分成两个集合,是每一个集合中的人都有朋友在两一个集合中,由于前天做了,二分图,就直接套了,结果wa,现在想想他们中间是有区别的,主要在于,二分图要求分成两个集合,每一个集合内的人互相不认识,所以在对已经分过集合的人的处理上有很大的去别 ,只要他和他的朋友颜色一样就结束了 ,而这里不处理这种情况,只要保证在输入的时候判下是不是有没有朋友的情况就可以了。View Code 1 #include <iostream> 2 #include < 阅读全文
posted @ 2012-03-25 09:51 我们一直在努力 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007本类题的做法思想就是不断的二分,直到剩余两个点或者三个点时直接算。这里存在的一个问题就是可能最近的点对不在二分的左右区间里,而是跨越两个区间,所以我们在做时刚开始时,对x轴由小到大排序,然后二分,在二分之后已经得到一个最小值ans,把在中心线左右ans内的点选出来,把这个区间的点按y坐标由小到大排序,由于这些点的个数有限,所以可以直接求,这里还可以有个优化,如果y方向上的差值大于ans的话 就可以break原因是y坐标是有序的从小到大。View Code 1 #include<cmath 阅读全文
posted @ 2012-03-23 17:43 我们一直在努力 阅读(347) 评论(1) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1392在判断左旋和右旋时 ,有多种方法, 其实质都是一样的View Code 1 /*#include <iostream> 2 #include <cmath> 3 #include <cstring> 4 #include <cstdio> 5 #include <algorithm> 6 using namespace std; 7 struct ss { 8 double x,y; 9 }point[110],stack[110]; 阅读全文
posted @ 2012-03-23 16:28 我们一直在努力 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 第三个问题,以下两个条件,至少满足一个,即可断定两线段相交:1)每个线段都跨越(straddle)包含了另一线段的直线(即最普通的相交)2)一个线段的某一个端点位于另一线段上(边界情况,包含重合)View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 struct ss{ 6 double x,y; 7 }a[105] 阅读全文
posted @ 2012-03-22 16:04 我们一直在努力 阅读(219) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159解题思路:用数组dp[i][j]表示消耗i个忍耐度杀死j个怪做能得到的经验的最大值,dp[i][j]=max(dp[i][j],dp[i-c[k][j-1]+d[k]);View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 int max(int x,int y 阅读全文
posted @ 2012-03-17 15:27 我们一直在努力 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110903&format=html最短路变形,也就是求最大的运载能力,Dijk变形使用,需要注意的一点是,最后求次数是要判是否能刚好运完 ,不能的话要多运一次,因为每次他都要去。View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdio> 5 using 阅读全文
posted @ 2012-03-13 21:16 我们一直在努力 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=11532&courseid=135题目大意:在一个无向图中求一个点到另外两个点的距离之和的最小值,如果有一段距离是他们公用的只能算一次,比如c到a,b.如果最短距离是有c到d之后到a,b的,只能算cd+da+db。设源点为S,另外两个点为A、B。我们可以先这样想:假如S到A、B两个点的最短路径没有交叉,那么结果就是dist[A]+dist[B];其实这个值也是最大值。如果有交叉的情况又是什么样的呢?假设交叉点是C,C到A、B的最短距离是dist1[A] 阅读全文
posted @ 2012-03-13 14:26 我们一直在努力 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 先废话一下.嗯 嗯 从今天开始 从基础一步一步开始 追逐我的梦想!今天先来讨论一下树状数组.问题提出:已知数组a[],元素个数为n,现在更改a中的元素,要求得新的a数组中i到j区间内的和(1<=i<=j<=n).思考:对于这个问题,我们可以暴力地来解决,从a[i]一直累加到a[j],最坏的情况下复杂度为O(n),对于m次change&querry,合起来的复杂度为O(m*n),在n或m很大的情况下,这样的复杂度是让人无法忍受的.另外,如果没有元素的变更,我们完全可以存储sum[1,k](k=1,2,……),然后对任意给定的查找区间[i,j],都可以方便的用ans=su 阅读全文
posted @ 2012-03-09 19:59 我们一直在努力 阅读(99) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=305这道题用递归写会比较简单点。View Code 1 #include <iostream> 2 #include <cmath> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 char a[500]; 7 int start; 8 int sove() 9 {10 int m,n;11 switch(a[start])12 {13 case ' 阅读全文
posted @ 2012-03-09 08:00 我们一直在努力 阅读(136) 评论(0) 推荐(0) 编辑