深度遍历算法php
遍历源节点所在的边 记录第一个和源节点有邻接关系的点记为s if(s没被访问)访问递归访问s所在的链 不然返回
遍历顺序
广度遍历算法node
遍历源节点的全部边而且入队 while(队不空) {s=队头 出队 if(s没被访问){ 将与s有邻接关系且同时没有被反问过的进行入队 } }
遍历顺序
Prim和Kruscal算法
两者都是对贪心算法的改进而生成的算法ios
针对如下数据生成的最小生成树顺序 0 1 1 1 3 2 0 2 3 1 2 4 2 3 1 prim算法<0,1><1,3><2,3> Kruscal算法<0,1><2,3><1,2>
Dijkstra算法git
初始化数组path[]=-1,dist[无穷大],s[]=0; 将源的s[]置1 更新dist和path u=源点; while(i<g.n){ 找到与源点有邻接关系的dist中的最小值 u=i; while(j<g.n){ if(dist[u]>dist[j]+g[u][j])更新dist数组 }
拓扑排序算法算法
初始化每一个元素的入度为0 遍历每一条链来统计每一个数的入度 入度为0入队 while(队不空){ 遍历队头所在的链,减小对应的点的入度 入度为0入队}
定义每一层次的队尾为last,层次为u=0 遍历源节点的全部边而且入队 last=源节点 u++; while(队不空&&u<=6) {s=队头 出队 if(s没被访问){ 将与s有邻接关系且同时没有被反问过的进行入队 } if(s==last)last=队尾,u++ }
本身打还好考试的时候没注意数据量用了矩阵作最后一个点过不去数组
prim算法 /*初始化访问数组vis表明是否加入到最小生成树, 初始化权重数组d为无穷*/ 将源点的vis置为1,更新与原点有邻接关系的节点的权重数组 for(int i=1;i<=n;i++) { u=-1; min=inf; 找寻d数组中的最小值 并记录最小值对应的下标。 if(u==-1)说明该图不可以连同return-1 else vis[u]=true; 路径叠加 for(int v=1;v<=n;v++) if(G[u][v]<d[v]) 更新dis数组 }
前面瞎写了一下后面参考书本更改了函数
初始化数组path[]=-1,dist[无穷大],s[]=0; 初始化记录路径总数的ans为0 将源的s[]置1 更新dist和pathans u=源点; while(i<g.n){ 找到与源点有邻接关系的dist中的最小值 u=i; while(j<g.n){ if(dist[u]>dist[j]+g[u][j].weight)更新dist数组,ans数组 else if(dist[u]==dist[j]+g[u][j].weight){ 更新dist数组ans数组 } } if(
这个路径的数目没有就解决一开始后面用叠加一下就能够解决学习
图的代码太长找了个比较感兴趣的代码
http://acm.hdu.edu.cn/showproblem.php?pid=1147
题意是在一个平面上按顺序摆上放一些棍子,求最后哪些棍子在最上面(此题只需考虑规范相交的状况)这样咱们只要判断这些棍子是否相交相交就是往上面
叠起来的意思spa
/** *判断后面的线段是否与前面的线段相交, *此题仍是一个判断线段是否相交的问题, *只是必须注意顺序,判断相交的函数减hdu1086 */ #include<iostream> #include<cstring> #include<cmath> using namespace std; typedef struct Node{ double x,y; }node; node p[100005],p1[100005]; double Direction(node pi,node pj,node pk){//计算叉乘 return (pk.x-pi.x)*(pj.y-pi.y)-(pj.x-pi.x)*(pk.y-pi.y); } bool Segments_X(node p1,node p2,node p3,node p4){//判断两条线段是否相交,相交返回true double d1,d2,d3,d4; d1=Direction(p3,p4,p1); d2=Direction(p3,p4,p2); d3=Direction(p1,p2,p3); d4=Direction(p1,p2,p4); if(d1*d2<=0&&d3*d4<=0) return true; return false; } int main() { int n; while(cin>>n&&n){ for(int i=1;i<=n;i++){ cin>>p[i].x>>p[i].y;//输入第一个点 cin>>p1[i].x>>p1[i].y;//输入第二个点 } cout<<"Top sticks: "; for(int i=1;i<n;i++){ int ok=1; for(int j=i+1;j<=n;j++){//之判断在该线段以后抛下的线段(木棍) if(Segments_X(p[i],p1[i],p[j],p1[j])){ ok=0; break; } } if(ok) cout<<i<<", "; } cout<<n<<"."<<endl;//输出最后一个 } return 0; }
这道题目难的不是解题可能更难的是看懂题目
就是利用数学去判断线段是否相交设计