数据结构与算法--第25讲图2.pptVIP

  • 1
  • 0
  • 约1.4万字
  • 约 80页
  • 2017-10-02 发布于广东
  • 举报
数据结构与算法--第25讲图2

* * * * * * * * * * * * * * * zhejiang University Online Judge 在同一个强连通分量里的所有的马之间是互相仰慕的,我们将其缩为一点,并且只记录这一点的马的数量,如果有最受欢迎的马存在,那么这个图将是连通图,并且出度为零的点只有一个,我们可以用并查集来判是否连通,然后计算每个节点的出度,即可求出最受欢迎的马的数量。 输入: 3 3 1 2 2 1 2 3 输出: 1 3 2 1 5 编码实现 5.1 Kruskal算法 class KruskalForest // Kruskal森林类 { private: int *treeNo; // 顶点所在的树编号 int vexNum; // 顶点数 public: KruskalForest(int num = DEFAULT_SIZE); ~KruskalForest(){ delete []treeNo; }; bool IsSameTree(int v1, int v2); // 判断v1和v2是否在同一棵树上 void Union(int v1, int v2); // 将v2所在树的所有顶点合并到v1所在树上 }; 5 编码实现 5.1 Kruskal算法 KruskalForest::KruskalForest(int num) // 操作结果:构造顶点数为num的Kruskal森林 { vexNum = num; // 顶点数 treeNo = new int[vexNum];// 分配存储空间 for (int v = 0; v vexNum; v++) { // 初始时,每棵树只有一个顶点,树的个数与顶点个数相同 treeNo[v] = v; } } 5 编码实现 5.1 Kruskal算法 bool KruskalForest::IsSameTree(int v1, int v2) // 操作结果:如果v1和v2在同一棵树上,则返回true,否则返回false { return treeNo[v1] == treeNo[v2]; } 5 编码实现 5.1 Kruskal算法 void KruskalForest::Union(int v1, int v2) // 操作结果:将v2所在树的所有顶点合并到v1所在树上 { int v1TNo = treeNo[v1], v2TNo = treeNo[v2]; for (int v = 0; v vexNum; v++) { // 查找v2所在树的顶点 if (treeNo[v] == v2TNo) { // // 将v2所在树上的顶点所在树编号改为v1所在树的编号 treeNo[v] = v1TNo; } } } 5 编码实现 5.1 Kruskal算法 // Kruskal边类 template class WeightType class KruskalEdge { public: int vertex1, vertex2; // 边的顶点 WeightType weight; // 边的权值 KruskalEdge(int v1 = -1, int v2 = -1, int w = 0); // 构造函数 }; 5 编码实现 5.1 Kruskal算法 template class WeightType void Sort(KruskalEdgeWeightType *a, int n) // 操作结果:按权值对边进行升序排序 { for (int i = n - 1; i 0; i--) for (int j = 0; j i; j++) if (a[j].weight a[j + 1].weight) { // 出现逆序,则交换a[j]与a[j + 1] KruskalEdgeWeightType tmpEdge; // 临时边 tmpEdge = a[j]; a[j] = a[j + 1]; a[j + 1] = tmpEdge; } } 5 编码实现 5.1 Kruskal算法 template class ElemType, class WeightType void MiniSpanTreeKruskal(const AdjListUndirNetworkElemType, WeightType net) // 初始条件:存在网net // 操作结果:用Kruskal算法构造网net的最小代价生成树 { int coun

文档评论(0)

1亿VIP精品文档

相关文档