- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
模板补充
目录
1.多边形的重心 1
2.广度优先搜索 2
3.拓扑排序 6
4.关键路径 8
5.最小生成树(prim) 12
6.Dijkstra算法求单源最短路径 15
7 .哈夫曼树得哈夫曼编码 17
8.最大团问题 19
9.二分图匹配 20
1.多边形的重心
三角形的重心: x = (xa+xb+xc)/3, y = (ya+yb+yc)/3;四边形的重心:作一对角线,将它分成两个三角形分别求出重心与面积 (x1,y1) ,s1 ; (x2, y2), s2 则该四边形的重心为: x = (x1*s1+x2*s2)/(s1+s2), y = (y1*s1+y2*s2)/(s1+s2);五边形则分为一个三角形与一个四边形……任意多边形中直接取任一点(一般为原点)把多边形分为n-2个三角形 分别求重心x=∑si*xi/∑siy=∑si*yi/∑sisi为每块三角形的有向面积,这里说的是“有向面积”!无论是否为凸多边形,这个公式都是成立的。
/*
假设在n边形的内部有原点,则将n边形可分为n个三角形,又由于质量均匀的
分布在n边形的区域上,可用各点坐标的加权平均数求得重心;该算法可推广
到原点在n边形的外部用数学方法可以证明这里不再证明。算法模板实现如下:
*/
//p必须已按逆时针或顺时针排好序
point p[MAX];
point gravity(int n){
point p1, s;
double tp, area = 0, tpx = 0, tpy = 0;
p1.x = p[0].x;
p1.y = p[0].y;
for (int i = 1; i = n; ++i)
{ // point: 0 ~ n-1
s.x = p[(i == n) ? 0 : i].x;
s.y = p[(i == n) ? 0 : i].y;
tp = (p1.x * s.y - s.x * p1.y);
area += tp / 2;
tpx += (p1.x + s.x) * tp;
tpy += (p1.y + s.y) * tp;
p1.x = s.x; p1.y = s.y;
}
s.x = tpx / (6 * area);
s.y = tpy / (6 * area);
return s;
}
2.广度优先搜索
#includequeue
#includestack
struct point
{//-1表示向上,表示向下,表示向左,表示向右,表示遍历起点
//-2表示还未确定从那一点到该点;方向均相对于搜索遍历而言
int x,y;
};
point create_node(int a,int b)
{
point L;
L.x=a;
L.y=b;
return L;
}
//map存放地图(为输入参数),map1不为输入参数
char map[1010][1010],map1[1010][1010];
//每次均得初始化路径记录
int memo[1010][1010];//记录路径及有最后一节点索引路径
int n,m;//n表示行数,m表示列数
//p为终点,st为起点,该模板返回st-p的最短路径长度
int BFS(point p,point st)
{//若返回路径长度为-1,表示起点和终点之间无路可通
int i,j;
for(i=0;in;i++)
{
for(j=0;jm;j++)
{
map1[i][j]=map[i][j];
}
}
int path=0;
queuepoint qu;
qu.push(st);
map1[st.x][st.y]=#;
qu.push(create_node(-1,-1));
point temp;
while(1)
{
if(qu.empty())
return -1;
temp=qu.front();
if(temp.x==-1)
{
qu.push(temp);
path++;
qu.pop();
temp=qu.front();
}
if(temp.x==p.xtemp.y==p.y)
{
return path;
}
qu.pop();
point* tp=temp;
if(map1[temp.x][temp.y+1]!=#temp.y!=m-1)
{//?#?号表示该处没有路可通(根据题意不同选用不同的符号)
qu.push(create_node(temp.x,temp.y+1));
memo[temp.x][temp.y+1]=2;
ma
文档评论(0)