最小生成树模板【kruskal & prim】

CDOJ 1966 Kruskal 解法

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 typedef long long LL;
 7
 8 const int N=2002;
 9 const int M=2e5+2;
10 int n,m,tot=0,num=0;
11 LL ans=0;
12 int f[N];
13 struct Node
14 {
15     int u,v;
16     LL w;
17     bool operator < (const Node & b)
18     {
19         return w < b.w;
20     }
21
22 }G[M];
23
24 int find(int x)
25 {
26     return x==f[x]?x:f[x]=find(f[x]);
27 }
28
29 int unite(int x,int y)
30 {
31     x=find(x);
32     y=find(y);
33     if(x!=y)f[x]=y;
34 }
35
36 void kruskal()
37 {
38     for(int i=1;i<=n;i++)f[i]=i;
39     sort(G,G+tot);
40     for(int i=0;i<tot;i++)
41     {
42         int u=find(G[i].u);
43         int v=find(G[i].v);
44         if(u!=v)
45         {
46             unite(u,v);
47             ans+=G[i].w;
48             num++;
49         }
50     }
51     if(num==n-1)
52     {
53         cout<<"yes"<<endl;
54         cout<<ans<<endl;
55     }
56     else
57         cout<<"no"<<endl;
58 }
59
60 int main()
61 {
62
63     cin>>n>>m;
64
65     while(m--)
66     {
67         int a,b,v,p;
68         cin>>a>>b>>v>>p;
69         if(p==0)continue;
70         G[tot].u=a;
71         G[tot].v=b;
72         G[tot].w=v;
73         tot++;
74     }
75     kruskal();
76     return 0;
77 }

prim模板:

 1 int cost[N][N]; // 表示e=(u,v)的权值,不存在情况为INF
 2 int mincost[N]; // 从集合x出发的边到每个顶点的最小权值
 3 bool vis[N];    // 集合x内的顶点
 4 int V;      // 顶点数
 5
 6 int prim()
 7 {
 8     for(int i=0;i<V;i++)
 9     {
10         mincost[i]=INF;
11         vis[i]=0;
12     }
13     mincost[0]=0; // 默认选第一个顶点为起始点
14     int res=0;
15
16     while(true)
17     {
18         int v=-1;
19         for(int u=0;u<V;u++)
20             if(!vis[u]&&(v==-1||mincost[u]<mincost[v]))v=u;
21
22         if(v==-1)break;
23         vis[v]=1;
24         res+=mincost[v];
25         for(int u=0;u<V;u++)
26         {
27             if(mincost[u]>cost[v][u])
28                 mincost[u]=cost[v][u];
29         }
30     }
31     return res;
32 }

原文地址:https://www.cnblogs.com/demian/p/9193915.html

时间: 2024-11-05 14:47:07

最小生成树模板【kruskal & prim】的相关文章

ACM:最小生成树,kruskal &amp;&amp; prim,并查集

题目: 输入顶点数目,边的数目,输入每条边的两个顶点编号还有每条边的权值,求最小生成树,输出最小生成树的权值.. 注意:prim算法适合稠密图,其时间复杂度为O(n^2),其时间复杂度与边得数目无关,而kruskal算法的时间复杂度为O(eloge)跟边的数目有关,适合稀疏图. kruskal----归并边:prim----归并点 方法一:kruskal,克鲁斯卡尔,并查集实现. #include <iostream> #include <algorithm> using name

最小生成树模板

//最小生成树模板 /* kruskal算法,把所有的边从小到大排序,接下来从小到大考查每条边(u,v); 1.u和v在同一个连通分量中,那么加入(u,v)后会形成环,因此不能选择. 2.如果u和v在不同的联通分量中,那么加入(u,v)一定是最优的. */ #include<iostream> #include<cstring> #include<algorithm> using namespace std; int fat[102];//存放父节点 struct Lu

HDU 1233 prim kruskal最小生成树模板题

A - 还是畅通工程 Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. Input 测试输入包含若干测试

最小生成树(kruskal模版 Prim模板)

http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2144&cid=1186 最小生成树,最重要的是了解思想 稠密图用Prim,稀疏图用Kruskal K(每次找最小的边连接,一条边连接两个点,所以单路就可以了) 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int bin[110]; 5 struct node 6 { 7 int

hdu 1162 Eddy&#39;s picture 最小生成树入门题 Prim+Kruskal两种算法AC

Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7428    Accepted Submission(s): 3770 Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to

【prim + kruscal 】 最小生成树模板

来源:dlut oj 1105: Zhuo’s Dream Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 40 Solved: 14[Submit][Status][Web Board] Description Zhuo is a lovely boy and always make day dream. This afternoon he has a dream that he becomes the king of a kingdom calle

最小生成树之Kruskal算法

上一篇文章中提到了最小生成树的Prim算法,这一节继续探讨一下最小生成树的Kruskal算法.什么是最小生成树算法上文已经交代过了,所以我们直接从Kruskal的步骤开始介绍. 1.Kruskal算法的步骤: a.假定拓扑图的边的集合是E,初始化最小生成树边集合G={}. b. 遍历集合E中的所有元素,并且按照权值的大小进行排序. c. 找出E中权值最小的边e . d .如果边e不和最小生成树集合G中的边构成环路,则将边e加到边集合G中:否则测试下一条权值次小的边,直到满足条件为止. e. 重复

最小生成树 prime kruskal

带权图分为有向和无向 无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法: 有向图的最短路径算法,有dijkstra算法和floyd算法. 生成树的概念:联通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树 生成树是联通图的极小连通子图.所谓极小是指:若在树中任意增加一条边,则 将出现一个回路:若去掉一条边,将会使之编程非连通图.生成树各边的权 值总和称为生成素的权.权最小的生成树称为最小生成树,常用的算法有prime算法和kruskal算法. 最小生成树

HDU 1863 (最小生成树之Kruskal) 畅通工程

模板题,学习一下最小生成树的Kruskal算法 对于稀疏图来说 按所给的边的权值从小到大排序,如果该边不与已经选的边形成环就选择它 这里用并查集来实现 第i条边的端点放在u.v数组中,权值保存在w中 这里用的是间接排序,也就是排的是每条边的序号,放在rank数组中 1 //#define LOCAL 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std;

数据结构(C实现)------- 最小生成树之Kruskal算法

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 算法描述: Kruskal算法是按权值递增的次序来构造最小生成树的方法. 假设G(V,E)最一个具有n个顶点的连通网,顶点集V={v1,v2,....,vn}.设所求的最小生成树为T={U,TE},其中U是T的顶点集,TE是T的边集,U和TE的初始值为空集.Kruskal算法的基本思想如下:将最小生成树初始化为T=(V,TE),仅包含 G的全部顶点,不包含G的任一条边,此时