kruskal 【MST】

const int MAXN = 110;//点
const int MAXM = 10000;//边

int f[MAXN];//并查集使用

struct Edge
{
    int u, v, w;
}edge[MAXN];

int tol;//边数 初始化 0

void addedge(int u,int v,int w)
{
    edge[tol].u = u;
    edge[tol].v = v;
    edge[tol++].w = w;
}

bool cmp(Edge a,Edge b)
{
    return a.w < b.w;
}

int find(int x)
{
    if (f[x] == -1)
        return x;
    else
        return f[x] = find(f[x]);
}

int kruskal(int n)
{
    memset(f,-1,sizeof(f));
    sort(edge, edge+tol, cmp);
    int cnt = 0;
    int ans = 0;
    for (int i = 0; i < tol; i++)
    {
        int u = edge[i].u;
        int v = edge[i].v;
        int w = edge[i].w;
        int t1 = find(u);
        int t2 = find(v);
        if (t1 != t2)
        {
            ans += w;
            f[t1] = t2;
            cnt++;
        }
        if (cnt == n - 1)
            break;
    }
    if (cnt < n - 1) return -1;//不连通
    else return ans;
}
时间: 2024-10-25 05:43:18

kruskal 【MST】的相关文章

Bzoj1083 1083: [SCOI2005]繁忙的都市【MST】

大水题,真不知道出题者是怎么把这么水的题出的这么长的TAT 其实这题在于考语文水平,一共三个要求,前两个要求意思就是要选出的道路是树形的,最后一个要求就是要权值最小,于是整个题意说白了就是求一棵MST,以前向星的形式给出最容易想到kruskal算法,于是这题顺利结束,从看题一直到调试结束半个小时搞定…… #include<iostream> #include<cstdio> #include <math.h> using namespace std; intfather

POJ2485 Highways 【MST】

Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22842   Accepted: 10525 Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. So the traffic is difficult in Flatopia. The Fl

POJ 1258 Agri-Net【MST】

Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 49389   Accepted: 20511 Description Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He nee

【MST+虚拟节点+Kruskal】swjtuOJ 2093

[MST+虚拟节点+Kruskal]swjtuOJ 2093 [注:交大的看到这篇文章要学会自己写,不要为了比赛而比赛!~] 题目大意 给你n个节点和n个节点的权值,m条连接边,求连通权值的最小和(MST) n <= 10^5 最小生成树问题,注意原图不一定连通,构造虚拟节点0,0到其他节点边权值赋值为节点权值,求增加2n条边之后的MST即可,注意多加n个节点,数组要开成原来的两倍,笔者RE了一次QAQ~ – 说一下思路 构造虚拟节点很好解决了点权值的问题,保证了图的连通性 节点n比较大,图用邻

POJ--1679--The Unique MST【kruskal判断MST是否唯一】

链接:http://poj.org/problem?id=1679 题意:告诉你有n个点,m条边,以及m条边的信息(起点.终点.权值),判断最小生成树是否唯一 判断MST是否唯一的思路是这样:对于每条边如果有和他相等权值的边,则做一个标记,然后进行一遍kruskal或prim找出最小生成树权值,然后对于每个使用过并且有相等边标记的边,把它从图中删去,再进行一遍kruskal或prim,如果此时最小生成树权值和第一次一样,则说明最小生成树不唯一,否则最小生成树唯一. #include<cstrin

【图论】信手拈来的Prim,Kruskal和Dijkstra

关于三个简单的图论算法 prim,dijkstra和kruskal三个图论的算法,初学者容易将他们搞混,所以放在一起了. prim和kruskal是最小生成树(MST)的算法,dijkstra是单源最短路径的算法. prim 最小生成树prim算法采用了贪心策略:把点分成两个集合,A为已被处理(已经在最小生成树中)的顶点,B为待处理的顶点,(A,B)也就是一个割.若边(u,v)满足u∈A,v∈B,那么(u,v)就是通过割(A,B)的一条边. 很自然的,会有一定数量的边会通过该割,其中权重最小的边

hdoj 1863 畅通工程 【最小生成树】+【kruskal】

题意:... 难点:如何判断是不是信息不全:在输入的时候建立并查集,之后判断有几个节点就可以了,剩下的就是kruskal算法. 代码: #include<stdio.h> #include<string.h> #include<algorithm> #define MAXN 105 #define INF 0x3f3f3f3f using std::sort; struct node{ int from; int to; int w; }edges[MAXN*MAXN]

【HDU1102】Constructing Roads(MST基础题)

最小生成树水题.prim一次AC 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cctype> 6 #include <cmath> 7 #include <algorithm> 8 #include <numeric> 9 10 #define typec int

【HDU1162】Eddy&#39;s picture(MST基础题)

很基础的点坐标MST,一不留神就AC了, - - !! 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cmath> 6 #include <cctype> 7 #include <algorithm> 8 #include <numeric> 9 #include &