最小生成树模板【kruskal & prim】
CDOJ 1966 Kruskal 解法
时间复杂度O(mlogm) m为边数,这里主要是边排序占时间,后面并查集还好
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL; const int N=;
const int M=2e5+;
int n,m,tot=,num=;
LL ans=;
int f[N];
struct Node
{
int u,v;
LL w;
bool operator < (const Node & b)
{
return w < b.w;
} }G[M]; int find(int x)
{
return x==f[x]?x:f[x]=find(f[x]);
} int unite(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)f[x]=y;
} void kruskal()
{
for(int i=;i<=n;i++)f[i]=i;
sort(G,G+tot);
for(int i=;i<tot;i++)
{
int u=find(G[i].u);
int v=find(G[i].v);
if(u!=v)
{
unite(u,v);
ans+=G[i].w;
num++;
}
}
if(num==n-)
{
cout<<"yes"<<endl;
cout<<ans<<endl;
}
else
cout<<"no"<<endl;
} int main()
{ cin>>n>>m; while(m--)
{
int a,b,v,p;
cin>>a>>b>>v>>p;
if(p==)continue;
G[tot].u=a;
G[tot].v=b;
G[tot].w=v;
tot++;
}
kruskal();
return ;
}
prim模板:主要用于稠密图,尤其是完全图的最小生成树
时间复杂度为O(n^2),如果用最小堆优化,为O(mlogn) [实际为O((m+n)logn),假设m边数>=n顶点数,从而简写] 算法分为两部分,一个找当前最小值,一个根据当前点的临边更新数组。logn获取最小值并从堆中删除,后用logn执行一条边的更新
int cost[N][N]; // 表示e=(u,v)的权值,不存在情况为INF
int mincost[N]; // 从集合x出发的边到每个顶点的最小权值
bool vis[N]; // 集合x内的顶点
int V; // 顶点数 int prim()
{
for(int i=;i<V;i++)
{
mincost[i]=INF;
vis[i]=;
}
mincost[]=; // 默认选第一个顶点为起始点
int res=; while(true)
{
int v=-;
for(int u=;u<V;u++)
if(!vis[u]&&(v==-||mincost[u]<mincost[v]))v=u; if(v==-)break;
vis[v]=;
res+=mincost[v];
for(int u=;u<V;u++)
{
if(mincost[u]>cost[v][u])
mincost[u]=cost[v][u];
}
}
return res;
}
最小生成树模板【kruskal & prim】的更多相关文章
- 最小生成树(Kruskal+Prim)--模板
最小生成树-----在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树. 应用场景 1.假设以下情景,有一块木板,板上钉上了一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通 ...
- poj 1258 最小生成树 模板
POJ 最小生成树模板 Kruskal算法 #include<iostream> #include<algorithm> #include<stdio.h> #in ...
- POJ-图论-最小生成树模板
POJ-图论-最小生成树模板 Kruskal算法 1.初始时所有结点属于孤立的集合. 2.按照边权递增顺序遍历所有的边,若遍历到的边两个顶点仍分属不同的集合(该边即为连通这两个集合的边中权值最小的那条 ...
- POJ1251 Jungle Roads (最小生成树&Kruskal&Prim)题解
题意: 输入n,然后接下来有n-1行表示边的加边的权值情况.如A 2 B 12 I 25 表示A有两个邻点,B和I,A-B权值是12,A-I权值是25.求连接这棵树的最小权值. 思路: 一开始是在做莫 ...
- 最小生成树算法(Prim,Kruskal)
边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...
- 【prim + kruscal 】 最小生成树模板
来源:dlut oj 1105: Zhuo’s Dream Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 40 Solved: 14[Submit][St ...
- 最小生成树(Kruskal和Prim算法)
关于图的几个概念定义: 关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vi与vj都有路 ...
- 洛谷P3366 【模板】最小生成树(Kruskal)
题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M<= ...
- 最小生成树的Kruskal算法实现
最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V ...
- 最小生成树之Kruskal
模板题,学习一下最小生成树的Kruskal算法 对于一个连通网(连通带权图,假定每条边上的权均为大于零的实数)来说,每棵树的权(即树中所有边的权值总和)也可能不同 具有权最小的生成树称为最小生成树 生 ...
随机推荐
- python类的内建方法
研究email源码学到的 class test(): """Class for generating text/* type MIME documents."& ...
- Python os.access() 方法
概述 os.access() 方法使用当前的uid/gid尝试访问路径.大部分操作使用有效的 uid/gid, 因此运行环境可以在 suid/sgid 环境尝试. 语法 access()方法语法格式如 ...
- js判断空字符串、null、undefined、空格、中文空格
代码 function isEmpty(obj) { if (obj === null) return true; if (typeof obj === 'undefined') { return t ...
- DCL单例模式
我们第一次写的单例模式是下面这样的: public class Singleton { private static Singleton instance = null; public static ...
- CodeForces 931C Laboratory Work 水题,构造
*这种题好像不用写题解... 题意: 一个人要改动别人的实验记录,实验记录记录是一个集合 实验记录本身满足:$max(X)-min(X)<=2$ 改动结果要求: 1.新的集合平均值和之前的一样 ...
- 通过flask实现web页面简单的增删改查
通过flask实现web页面简单的增删改查 # 1.后台程序falsk_web01.py #coding:utf-8 from flask import Flask,render_template,r ...
- MS SQL Server 建库建表
CREATE DATABASE Test use Test --创建用户类型表CREATE TABLE UserType ( ID INT NOT NULL identity(1,1) primary ...
- vue.js的学习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- NPOI写Excel,Spire.XLS for.NET组件转换Excel为PDF
首先要引用NPOI动态库和Microsoft.Office.Interop.excel.dll (Microsoft.Office.Interop.excel.dll 最好使用使用NuGet下载 , ...
- Walle,一个开源的web代码发布管理系统
前言 Walle 一个web部署系统工具,可能也是个持续发布工具,配置简单.功能完善.界面流畅.开箱即用!支持git.svn版本管理,支持各种web代码发布,静态的HTML,动态PHP,需要编译的JA ...