最小生成树指的是在图上面找到权值最小的一棵树,并且保证图上所有的点都在这棵树上。

解决办法:Kruskal 算法(贪心思想)

将边按权值从小到大排序,然后按这个顺序不断连边,直到所有点联通。

/**
 *  Fuck you.
 *  I love you too.
 */

#include<bits/stdc++.h>
#define lson i<<2
#define rson i<<2|1
#define LS l,mid,lson
#define RS mid+1,r,rson
#define mem(a,x) memset(a,x,sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define ll long long
#define ull unsigned long long
#define lowbit(x) (x&-x)
#define enld endl
#define mian main
#define itn int
#define prinft printf

const double PI = acos (-1.0);
const int INF = 0x3f3f3f3f;
const int EXP = 1e-8;
const int N = 1e5 + 5;
const int MOD = 1e9 + 7;
const int MAXN = 1e5 + 5;

using namespace std;

int n;
int ans;
int par[N];

struct ed {
    int s, e, cost;
} edge[MAXN];

bool cmp (ed a, ed b) {
    return a.cost < b.cost;
}

int Find (int a) {
    return a == par[a] ? a : par[a] = Find (par[a]);
}

void join (int a, int b) {
    par[Find (a)] = Find (b);
}

int main() {
    while (~scanf ("%d", &n)) {
        ans = 0;
        for (int i = 0; i < n; ++i) {
            scanf ("%d%d%d", &edge[i].s, &edge[i].e, &edge[i].cost);
            par[edge[i].s] = edge[i].s;
            par[edge[i].e] = edge[i].e;
        }
        sort (edge, edge + n, cmp);
        for (int i = 0; i < n; ++i) {
            if (Find (edge[i].s) != Find (edge[i].e)) {
                cout << edge[i].s << ' ' << edge[i].e << endl;
                join (edge[i].s, edge[i].e);
                ans += edge[i].cost;
            }
        }
        cout << ans << endl;
    }
    return 0;
}

  

Hdu - 1162 Eddy's picture (完全图)

 /**
  *  Fuck you.
  *  I love you too.
  */

 #include<bits/stdc++.h>
 #define lson i<<2
 #define rson i<<2|1
 #define LS l,mid,lson
 #define RS mid+1,r,rson
 #define mem(a,x) memset(a,x,sizeof(a))
 #define gcd(a,b) __gcd(a,b)
 #define ll long long
 #define ull unsigned long long
 #define lowbit(x) (x&-x)
 #define enld endl
 #define mian main
 #define itn int
 #define prinft printf

 const double PI = acos (-1.0);
 const int INF = 0x3f3f3f3f;
 ;
 ;
 ;
 ;

 using namespace std;

 int n;
 int ans;
 int par[N];

 struct ed {
     int s, e, cost;
 } edge[MAXN];

 bool cmp (ed a, ed b) {
     return a.cost < b.cost;
 }

 int Find (int a) {
     return a == par[a] ? a : par[a] = Find (par[a]);
 }

 void join (int a, int b) {
     par[Find (a)] = Find (b);
 }

 int main() {
     while (~scanf ("%d", &n)) {
         ans = ;
         ; i < n; ++i) {
             scanf ("%d%d%d", &edge[i].s, &edge[i].e, &edge[i].cost);
             par[edge[i].s] = edge[i].s;
             par[edge[i].e] = edge[i].e;
         }
         sort (edge, edge + n, cmp);
         ; i < n; ++i) {
             if (Find (edge[i].s) != Find (edge[i].e)) {
                 cout << edge[i].s << ' ' << edge[i].e << endl;
                 join (edge[i].s, edge[i].e);
                 ans += edge[i].cost;
             }
         }
         cout << ans << endl;
     }
     ;
 }

Hdu - 1233 还是畅通工程(将上面的模板添加一行即可AC)

 /**
  *  Fuck you.
  *  I love you too.
  */

 #include<bits/stdc++.h>
 #define lson i<<2
 #define rson i<<2|1
 #define LS l,mid,lson
 #define RS mid+1,r,rson
 #define mem(a,x) memset(a,x,sizeof(a))
 #define gcd(a,b) __gcd(a,b)
 #define ll long long
 #define ull unsigned long long
 #define lowbit(x) (x&-x)
 #define enld endl
 #define mian main
 #define itn int
 #define prinft printf

 const double PI = acos (-1.0);
 const int INF = 0x3f3f3f3f;
 ;
 ;
 ;
 ;

 using namespace std;

 int n;
 int ans;
 int par[N];

 struct ed {
     int s, e, cost;
 } edge[MAXN];

 bool cmp (ed a, ed b) {
     return a.cost < b.cost;
 }

 int Find (int a) {
     return a == par[a] ? a : par[a] = Find (par[a]);
 }

 void join (int a, int b) {
     par[Find (a)] = Find (b);
 }

 int main() {
     ) {
         ans = ;
         n = n * (n - ) / ;
         ; i < n; ++i) {
             scanf ("%d%d%d", &edge[i].s, &edge[i].e, &edge[i].cost);
             par[edge[i].s] = edge[i].s;
             par[edge[i].e] = edge[i].e;
         }
         sort (edge, edge + n, cmp);
         ; i < n; ++i) {
             if (Find (edge[i].s) != Find (edge[i].e)) {
                 //cout << edge[i].s << ' ' << edge[i].e << endl;
                 join (edge[i].s, edge[i].e);
                 ans += edge[i].cost;
             }
         }
         cout << ans << endl;
     }
     ;
 }

Hdu - 1598 find the most comfortable road

并查集 + 枚举

先排序(从大到小,从小到大都行),再枚举所有的边,记录其中的最大最小值,更新答案。

 /**
  *  Fuck you.
  *  I love you too.
  */

 #include<bits/stdc++.h>
 #define lson i<<2
 #define rson i<<2|1
 #define LS l,mid,lson
 #define RS mid+1,r,rson
 #define mem(a,x) memset(a,x,sizeof(a))
 #define gcd(a,b) __gcd(a,b)
 #define ll long long
 #define ull unsigned long long
 #define lowbit(x) (x&-x)
 #define enld endl
 #define mian main
 #define itn int
 #define prinft printf

 const double PI = acos (-1.0);
 const int INF = 0x3f3f3f3f;
 ;
 ;
 ;
 ;

 using namespace std;

 int n, m, q;
 int Max, Min, ans;
 int x, y;
 int par[N];

 struct ed {
     int s, e, cost;
 } edge[MAXN];

 bool cmp (ed a, ed b) {
     return a.cost < b.cost;
 }

 int Find (int a) {
     return a == par[a] ? a : par[a] = Find (par[a]);
 }

 void join (int a, int b) {
     par[Find (a)] = Find (b);
 }

 void init() {
     ; i < m+; ++i)
         par[i] = i;
 }

 int main() {
     while (~scanf ("%d%d", &n, &m)) {
         mem (par, );
         ; i < m; i++) {
             scanf ("%d%d%d", &edge[i].s, &edge[i].e, &edge[i].cost);
         }
         sort (edge, edge + m, cmp);
         scanf ("%d", &q);
         while (q--) {
             scanf ("%d%d", &x, &y);
             ans = INF;
             ; j < m; j++) {
                 init();
                 Min = INF, Max = ;
                 for (int i = j; i < m; i++) {
                     if (Find (edge[i].s) != Find (edge[i].e)) {
                         join (edge[i].s, edge[i].e);
                         Min = min (Min, edge[i].cost), Max = max (Max, edge[i].cost);
                     }
                     if (Find (x) == Find (y)) {
                         ans = min (ans, Max - Min);
                         break;
                     }
                 }
             }
             if (ans == INF)
                 cout << "-1" << endl;
             else {
                 cout << ans << endl;
             }
         }
     }
     ;
 }

Kruskal 模板的更多相关文章

  1. Kruskal模板

    Kruskal模板 struct Edge { int from,to,v; }edge[maxn*10]; int fa[maxn]; int n,m; int find(int x) { retu ...

  2. POJ 1287 Networking【kruskal模板题】

    传送门:http://poj.org/problem?id=1287 题意:给出n个点 m条边 ,求最小生成树的权 思路:最小生树的模板题,直接跑一遍kruskal即可 代码: #include< ...

  3. 最小生成树kruskal模板

    算法思路:每次选取权值最小的边,判断这两个点是否在同一个集合内,如果在则跳过,如果不在则加上这条边的权值 可以使用并查集储存结点,可以快速判断结点是否在同一集合内. #include<iostr ...

  4. 最小生成树prim和kruskal模板

    prim: int cost[MAX_V][MAX_V]; //cost[u][v]表示边e=(u,v)的权值(不存在的情况下设为INF) int mincost[MAX_V]; //从集合X出发的每 ...

  5. HDU 2988 Dark roads(kruskal模板题)

    Dark roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 【还是畅通工程 HDU - 1233】【Kruskal模板题】

    Kruskal算法讲解 该部分内容全部摘录自刘汝佳的<算法竞赛入门经典> Kruskal算法的第一步是给所有边按照从小到大的顺序排列. 这一步可以直接使用库函数 qsort或者sort. ...

  7. Prime算法 与 Kruskal算法求最小生成树模板

    算法原理参考链接 ==> UESTC算法讲堂——最小生成树 关于两种算法的复杂度分析 ==> http://blog.csdn.net/haskei/article/details/531 ...

  8. 最小生成树(次小生成树)(最小生成树不唯一) 模板:Kruskal算法和 Prim算法

    Kruskal模板:按照边权排序,开始从最小边生成树 #include<algorithm> #include<stdio.h> #include<string.h> ...

  9. 【次小生成树】【Kruskal】【prim】【转】

    原博客出处:https://blog.csdn.net/yasola/article/details/74276255 通常次小生成树是使用Prim算法进行实现的,因为可以在Prim算法松弛的同时求得 ...

随机推荐

  1. 【学习笔记】AspectJ笔记

    AspectJ的概念 是一种静态编译期增强性AOP的实现 在编译过程中修改代码加入相关逻辑,无需程序员动手 AspectJ具体用法 下载安装AspectJ,启动jar文件,安装到JDK目录,添加pat ...

  2. Spring Cloud (十三) Zuul:静态路由、静态过滤器与动态路由的实现

    前言 本文起笔于2018-06-26周二,接了一个这周要完成的开发任务,需要先等其他人的接口,可能更新的会慢一些,还望大家见谅.这篇博客我们主要讲Spring Cloud Zuul.项目地址:我的gi ...

  3. javascript类式继承最优版

    直接看实例代码: <!doctype html> <html lang="en"> <head> <meta charset=" ...

  4. 编写 grunt 插件经验

    第一步: 先生成插件模板: 利用命令生成, 首先通过github工具获取gruntplugin模板文件: 第二步: 了解plugin/tasks/taskName.js的registerMultiTa ...

  5. alert换行警示

    alert("再次向您问好!在这里,我们向您演示" + '\n' + "如何向警告框添加折行.")

  6. Git常见错误处理

      如果输入$ Git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git  提示出错信息:fatal: remo ...

  7. mysql区间范围查询问题

    一,日期区间查询,表里有一个时间字段 最常见的就是某时间段查询,比如xxxx时间---xxxx时间有多少条数据.例如数据库里的字段是 income_period, 该字段类型可以是字符串(varcha ...

  8. 如何新建Quartus工程—FPGA入门教程【钛白Logic】

    这一章我们来实现第一个FPGA工程—LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...

  9. React-Native 之 ListView使用

    前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...

  10. 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)(转)

    前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC Mi ...