文章插图
1 //深度优先搜索 2 //利用栈,现将右子树压栈再将左子树压栈 3 void DepthFirstSearch(BitNode *root) 4 { 5stack
三、无根树变成有根树:
选择一个点作为根结点, 开始遍历 。
遍历到一个点时, 枚举每一条连接它和另一个点的边 。若另一个点不是它的父结点, 那就是它的子结点 。递归到子结点 。
我们可以更加形象的比喻为:抓住一个点,把它拎起来构成一棵新的树 。
四、并查集:
这是我学OI这么久以来觉得性价比最高的算法(简单又实用啊!!),用来处理不相交合并和查询问题 。
给大家推个超超超超级易懂的blog,保证一看就懂,这里我就不再详解了:
五、最小生成树:
1.Prim算法(适用于稠密图):
算法描述:
1).输入:一个加权连通图,其中顶点集合为V,边集合为E;
2).初始化:Vnew= {x},其中x为集合V中的任一节点(起始点),Enew= {},为空;
3).重复下列操作,直到Vnew= V:
a.在集合E中选取权值最小的边,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
b.将v加入集合Vnew中,将边加入集合Enew中;
4).输出:使用集合Vnew和Enew来描述所得到的最小生成树 。
文章插图
1 #include//普里姆算法 2 const int N=1050; 3 const int M=10050; 4 struct Edge//定义图类型结构体,a到b权值为c 5 { 6int a,b,c; 7 }edge[M]; 8 int n,m;//n个点,m条边9 bool black[N];//染黑这个点,表示这个点已经被选过了 10 int ans=0;//最小生成树权值和11 int main()12 {13int i,j,k;14scanf("%d%d",&n,&m);15for(i=1;i<=m;i++)16scanf("%d%d%d",&edge[i].a,&edge[i].b,&edge[i].c);17black[1]=1;//把第一个点染黑(从第一个点找起)18for(k=1;k
2.算法(适用于稀疏图):
算法描述:
克鲁斯卡尔算法从另一途径求网的最小生成树 。
假设连通网N=(V,{E}),则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{∮}),图中每个顶点自成一个连通分量 。
在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边 。
依次类推,直至T中所有顶点都在同一连通分量上为止 。
文章插图
1 #include
- Vue 引入 mui 组件
- matlab 求解线性方程组之LU分解
- 不懂电脑如何买电脑,我自己不懂组装电脑,可以在网上买配件,自己组装吗
- 路由器的三种分组交换方式
- 日用行业外贸ERP软件系统,提高工作效率降低成本
- mysql 表组是什么_数据库中属性组究竟是什么含义?
- PS创建选区的工具-----套索工具组
- IGMP Snooping的工作机制
- Listener的常用方法
- 上行速度有什么用,ADSL提高上行速度有哪些途径?