- 博客(31)
- 收藏
- 关注
原创 HDU 2133
#includeusing namespace std;int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};char name[8][20]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};int Dateweek(int year,int
2013-12-27 15:50:23
535
原创 拓扑排序
HDU3342#include#include#include#include#include#includeusing namespace std;int N,M;vector G[105];int Count[105];int ans[105],pos;int first[105];void TopoSort(){ queue q;
2013-12-19 17:33:39
513
转载 C语言平面几何19-三角形的重心和垂心
三角形的重心:三角形三条中线的交点。该交点到顶点的距离是到对边中点距离的2倍。三角形的垂心:三角形三条高的交点。/* 三角形的重心 */Point BaryCenter(Triangle t){ // 三条中线的交点 Point m = MiddlePoint(t.B, t.C); Line l1 = LineMake(t.A, m); Point n = MiddlePo
2013-12-17 17:30:47
1141
转载 C语言平面几何18-三角形的内心和内切圆
三角形的内心,就是其内切圆的圆心。三角形三内角平分线相交于一点,该点即为内心。/* 三角形的内心 */Point Incenter(Triangle t){ Line l1 = AngleBisector(t.A, t.B, t.C); Line l2 = AngleBisector(t.B, t.A, t.C); int flag; return LinesIntersectio
2013-12-17 17:29:44
1069
转载 C语言平面几何17-角平分线
角平分线的求解思路,如图,求∠ABC的角平分线:(1)在BC(或BC的延长线)上取一点D,使|AB|=|BD|。(2)求线段AD的中点E,则直线BE即为∠ABC的角平分线。点D的坐标可以根据三角形相似来求解,如x满足|BD|/|BC|=(D.x-B.x)/(C.x-B.x)。/* 角平分线,输入:角ABC<180度 */Line AngleBisector(Point A,
2013-12-17 17:29:06
892
转载 C语言平面几何16-三角形的外心和外接圆
三角形的外心,就是其外接圆的圆心。三角形三边的垂直平分线相交于一点,该点即为外心。/* 三角形的外心 */Point Excenter(Triangle t){ Line l1 = PerpendicularBisector(t.A, t.B); Line l2 = PerpendicularBisector(t.A, t.C); int flag; return LinesInt
2013-12-17 17:28:22
898
转载 C语言平面几何15-线段的垂直平分线
线段AB的垂直平分线:先求中点M,再根据线段AB的斜率k1求出直线的斜率k2,k1*k2=-1,最后求出线段的方程:kx-y+C=0。/* 线段的垂直平分线 */Line PerpendicularBisector(Point A, Point B){ Point m; // 中点 m.x = (A.x + B.x)/2; m.y = (A.y + B.y)/2; Line
2013-12-17 17:27:45
1231
转载 C语言平面几何14-三角形的面积
求三角形ABC的面积S。1)S=底*高/22)S2=p*(p-a)*(p-b)*(p-c),其中p=(a+b+c)/2C语言代码:/* 三角形的面积: 底*高/2 */double AreaOfTriangle(Triangle t){ Line l = LineMake(t.A, t.B); double d = DistanceOfPoints(t.A, t.B);
2013-12-17 17:26:20
775
转载 C语言平面几何13-两直线的夹角
平面几何中,两直线的夹角定义为两条直线所形成的不大于90度的角。两直线夹角θ:tgθ=|(k2-k1)/(1+k1*k2)|,k1、k2分别为两直线的斜率直线A1x+B1y+C1=0和A2y+B2y+C2=0的夹角θ:tgθ=|(A1B2-A2B1)/(A1A2+B1B2)|。C语言代码:/* 两直线的夹角,返回角度值,非弧度值 */double IncludedAngl
2013-12-17 17:25:35
2082
转载 C语言平面几何12-向量方法判断线段与矩形是否有交集
向量方法判断线段与矩形是否有交集,通过向量叉乘的结果正负来判断,当矩形在线段的某一侧时,叉乘的结果要么全正,要么全负,此时无交集。判断有2步:1)快速排斥,2)叉乘。int RSIntersection(Rectangle r, Point A, Point B){ MBR m1 = (MBR)r; MBR m2 = MbrConstruct(A, B); // 快速排斥 if
2013-12-17 17:24:54
875
转载 C语言平面几何11-点关于直线的对称点
求点P(x0, y0)关于直线Ax+Bx+C=0的对称点M(x1, y1),满足两个条件:(1)线段PM的中点在直线上(2)PM与直线垂直/* 点关于直线的对称点 */Point SymmetricalPoint(Point p, Line l){ Point s; double tmp = l.A * l.A + l.B * l.B; s.x = (l.B *l.B*p
2013-12-17 17:23:55
937
转载 C语言平面几何10-点到直线的垂点
求点A(x0, y0)到直线Ax+By+C=0的垂点B(x1, y1),满足两个条件:(1)Ax1+By1+C=0,点B在直线上(2)(y1-y0)/(x1-x0) * A/B=1,两线垂直,斜率k1 * k2 = -1。注:判断两直线垂直的方法有(1)A1A2+B1B2=0,(2)k1*k2 = -1。/* 计算点到直线的垂点 */Point VerticalPoint(P
2013-12-17 17:23:12
844
转载 C语言平面几何9-两直线的交点
求平面中两直线的交点,当两直线不平行时,必定只有一个交点。/* 返回两直线的交点 */Point LinesIntersection(Line m, Line n, int *flag){ double d = n.A * m.B - m.A * n.B; if (d == 0) { *flag = 0; return; } Point i; i.x = (n.B *
2013-12-17 17:21:40
997
转载 C语言平面几何8-两直线的位置关系
平面中,两直线不相交就平行,相交中又分垂直相交和非垂直相交,两直线重合可认为是特殊的平行。C语言代码如下:/* 两直线的关系 * 平面中,两直线不相交就平行 */int TwoLines(Line m, Line n){ // 平行:A1/B1 = A2/B2 if (m.A * n.B == m.B * n.A) { // 两直线斜率相同 if (m.C * n.B
2013-12-17 17:20:49
829
转载 C语言平面几何7-直线与圆的位置关系
直线与圆的位置关系有3种:1,相离,有0个交点2,相切,只有1个交点3,相交,有2个交点C语言代码如下:// 直线与圆的位置关系:0-相离,1-相切,2-相交int LineAndCircle(Line l, Circle c){ double d = DistanceOfPointToLine(c.centre, l); double r = c.radius; i
2013-12-17 17:19:43
1449
转载 C语言平面几何6-判断线段是否与矩形范围有交集
判断线段AB是否与矩形范围有交集这里的矩形指的是边与坐标轴平行的矩形,可用x和y上最大最小值表示。判断是否相交,先快速排斥,再做跨立,通过向量的叉积判断矩形的四个顶点是否在线段的两侧,是说明有交集。(如果判断与矩形的边是否有交集的话,可判断线段是否与矩形的每条边是否有交集,线段与线段的交集判断。) 这里在介绍另外一种方法,降维的方法:例如,有线段AB和矩形MN,如图所示:
2013-12-17 17:18:52
780
转载 C语言平面几何5-两点确定一条直线
/* 两个不同点A,B确定一条直线,AB相同返回的值全0 * 直线方程:Ax+By+c=0 * A = y2 - y1; * B = x1 - x2; * C = -A*x1 - B*y1 = x2*y1 - x1*y2; */Line LineMake(Point A, Point B){ Line l; l.A = B.y - A.y; l.B = A.x - B.
2013-12-17 17:17:26
1962
转载 C语言平面几何4-两线段是否相交
判断两线段是否相交:方法(1):快速排斥(两个MBR是否有交集)+跨立(一个线段的两个端点在另一线段的两端)。给出C语言代码如下:/* * 由两个点构造一个向量 */Vector VectorConstruct(Point A, Point B){ Vector v; v.x = B.x - A.x; v.y = B.y - A.y; return v;}//
2013-12-17 17:15:15
1005
转载 C语言平面几何3-点是否在线段上
判断点P是否在线段AB上方法很多,这里给出两种。(1)通过距离判断,点P在线段AB上|AP|+|PB|=|AB|(2)通过向量叉积判断,点在线段上向量AP×向量AB=0,并且点P坐标在AB坐标之间C语言代码如下:/* 点是否在线段上: 距离判断 */int PointIsOnSegment(Point P, Point A, Point B){ double d1 = Dis
2013-12-17 17:14:02
995
转载 C语言平面几何1-数据类型的定义
数学中的部分概念在C语言中的定义如下(注:为了与数学一致,有些参数使用了大写):/* 点 */typedef struct point{ double x; double y;}Point;/* 向量 */typedef Point Vector;/* 线段AB */typedef struct segment{ Point A; Point B;}Segment;
2013-12-17 17:12:30
699
转载 C语言-向量基本概念
向量:既有大小又有方向的量叫向量。向量的模:向量的长度称为向量的模,用符号| |表示。零向量:长度为0的向量单位向量:长度为1的向量平面中,设有向量a={x1, y1},向量b={x2, y2},则有(1) 向量的加:a+b={x1+x2, y1+y2}(2) 向量的减:a-b={x1-x2, y1-y2}(3) 向量的点积(内积):
2013-12-17 17:10:26
3196
转载 匈牙利算法
用匈牙利算法求二分图的最大匹配什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到。二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识);第二种就是我现在要讲的匈牙利算法。这个算法说白了就是最大流的算法,但是它跟据二分图匹配这个问题的特点,把最大流算法做了简化,提高了效率。匈牙利算法其实很简单,但是网上搜不到什么说得清楚的文章。
2013-12-03 20:38:02
470
原创 HDU3970.cpp
/*代码慢慢敲,教训*/#include#include#include#includeusing namespace std;#define size 1010#define INF 99999999int n,m,a,b,d,p,s,t;int S[size],dist[size],value[size];int map[size][size],cos[size][siz
2013-11-17 21:45:23
796
原创 HDU1867.cpp KMP中发生不匹配时,j=next[j],j的含义
#include#include#define size 100009void getnext(char *p,int *next){ int i,j; next[0]=-1; i=0,j=-1; int len=strlen(p); while(il2) i=l1-l2; while(i<l1 && jl2) printf("%s\n",ans2); else if(l10) printf("%
2013-11-14 15:17:28
783
原创 HDU1358.cpp(KMP学习)
/*字符串长度为n,那么n-next[n](字符串从0开始)是最小循环节, 如果n能整除n-next[n],周期为n/(n-next[n]);*/#include#include#define size 1000002int n;char s[size];int next[size];int temp;void getnext(){ int i,j;
2013-11-11 16:34:31
436
转载 KMP中的getnext函数中的周期原理,和重要性质
---------------------------------------------- k m x j i由上,next【i】=j,两段红色的字符串相等(两个字符串完全相等),s[k....j]==s[m....i]设s[x...j]=s[j....i](xj=ji)则可得,以下简写字符串表达方式kj=
2013-11-10 16:42:22
591
转载 POJ 2533 求最长上升子序列长度 非DP 实现
#include#include#define maxn 1001using namespace std;int stack[maxn],N;int main(){ scanf("%d",&N); int top=0; stack[0]=-1; for(int i=0;i<N;i++) { int temp;
2013-07-16 11:00:11
456
原创 POJ 2533 最长上升子序列长度的求解 DP实现
#include#include#define maxn 1001using namespace std;int N;//数据个数int a[maxn];//储存数据int dp[maxn];//dp[i]表示以i结束的最长上升子序列的最大长度 初始为1int main(){ while(~scanf("%d",&N)) { for(int i=1
2013-07-16 10:57:54
496
原创 HDU1232
http://acm.hdu.edu.cn/showproblem.php?pid=1232#include#include#define maxn 1001using namespace std;int parent[maxn],M,N;void UFset(int end){ for(int i=1;i<=end;i++) parent[i] =
2013-07-13 16:24:57
538
转载 01背包
http://acm.hdu.edu.cn/showproblem.php?pid=3466#include#include#include#includeusing namespace std;struct item{ int p,q,v; bool operator < (const item it ) const{ return q-p < it.q-it.
2013-07-13 12:13:06
411
原创 hdu 2955(Robberies)
背包变种 dp[j]表示不被抓的概率#include#include#define maxn 109#includeusing namespace std;int money[maxn];float caught[maxn],dp[maxn*maxn];int main(){ int T,banks; float limits; scanf("%d",&
2013-07-13 12:09:27
430
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人