次小生成树 克鲁斯卡尔

题目链接:https://cn.vjudge.net/contest/67265#problem/D

具体思路:这个题如果用prim的话,对于重边,如果用数组是存不了的,所以可以通过克鲁斯卡尔算法求次小生成树。

首先,求出最小生成树,在求最小生成树的过程中,记录下都有哪些边被记录到了最小生成树上,然后再试着求次小生成树。

每一次取最小生成树上的一条边,去除这条边,然后再跑一下克鲁斯卡尔算法,看一下这个时候的总的权值是多少,然后再取一个最小的,如果存在次小生成树的话,这就是次小生成树的值。

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
# define inf 0x3f3f3f3f
# define maxn 200+100
# define ll long long
struct edge
{
    int fr;
    int to;
    int cost;
} q[maxn*4];
int vis[maxn];
int father[maxn];
int n,m,ans;
int num;
int Find(int t)
{
    return t==father[t]?t:father[t]=Find(father[t]);
}
bool cmp(edge t1,edge t2)
{
    return t1.cost

 

转载于:https://www.cnblogs.com/letlifestop/p/10262820.html

你可能感兴趣的:(次小生成树 克鲁斯卡尔)