【ACM算法】-- 图论篇 - 最小生成树(MST)
第一题: 这里讨论最小生成树问题,最小生成树是原图的一个子图,其中包含所有节点,仅含有部分边,使得这个子图为连通图,且不含有环路,并且边上的权值和最小,则称为最小生成树。 思路: 这道题用克鲁斯卡尔的方法来求最小生成树: 如上图:我们需要两种数据结构,一个是用来确定两个点是否属于一个集合,另一个是我们要将边的权值进行排序,需要一个struct来存储边,并且用到了重载小于号,使用sort快排。 代码如下: # include <stdio.h> # include <algorithm> using namespace std ; # define N 101 int Tree [ N ] ; int findRoot ( int x ) { if ( Tree [ x ] == - 1 ) return x ; else { int tmp = findRoot ( Tree [ x ] ) ; Tree [ x ] = tmp ; return tmp ; } } struct Edge { int a , b ; int cost ; bool operator < ( const Edge & A ) const { return cost < A . cost ; } } edge [ 6000 ] ; int main ( ) { int n ; freopen (