最小生成树 之 CODE[VS] 1231 最优布线问题

/*
  最小生成树 之 CODE[VS] 1231 最优布线问题
  Kruskal算法(邻接表)
*/
  1 #include <iostream>
  2 #include <cstdlib>
  3 #include <cstdio>
  4 #include <cstddef>
  5 #include <iterator>
  6 #include <algorithm>
  7 #include <string>
  8 #include <locale>
  9 #include <cmath>
 10 #include <vector>
 11 #include <cstring>
 12 #include <map>
 13 #include <utility>
 14 #include <queue>
 15 #include <stack>
 16 #include <set>
 17 #include <functional>
 18 using namespace std;
 19 typedef pair<int, int> PII;
 20 typedef long long int64;
 21 const int INF = 0x3f3f3f3f;
 22 const int modPrime = 3046721;
 23 const double eps = 1e-9;
 24 const int MaxN = 100010;
 25 const int MaxM = 100010;
 26
 27
 28
 29 /***************************************************/
 30 /*Union-find sets*/
 31 int ftr[MaxN];
 32 int rnk[MaxN];
 33
 34 void ufsIni(int n)
 35 {
 36     for (int i = 0; i <= n; ++i)
 37     {
 38         ftr[i] = i;
 39         rnk[i] = 0;
 40     }
 41 }
 42
 43 int ufsFind(int x)
 44 {
 45     if (x == ftr[x]) return x;
 46     return ftr[x] = ufsFind(ftr[x]);
 47 }
 48
 49 void ufsUnion(int x, int y)
 50 {
 51     x = ufsFind(x);
 52     y = ufsFind(y);
 53     if (x == y) return;
 54
 55     if (rnk[x] < rnk[y])
 56     {
 57         ftr[x] = y;
 58     }
 59     else
 60     {
 61         ftr[y] = x;
 62         if (rnk[x] == rnk[y])
 63         {
 64             ++rnk[x];
 65         }
 66     }
 67 }
 68
 69 bool ufsSame(int x, int y)
 70 {
 71     return (ufsFind(x) == ufsFind(y));
 72 }
 73
 74 /***************************************************/
 75
 76 int N, M;
 77 struct Edge
 78 {
 79     int u, v, cost;
 80 };
 81
 82 bool Cmp(const Edge e1, const Edge e2)
 83 {
 84     return e1.cost < e2.cost;
 85 }
 86 Edge edge[MaxM];
 87
 88
 89 void Solve()
 90 {
 91     ufsIni(N);
 92     sort(edge, edge + M, Cmp);
 93     int64 ans = 0;
 94     for (int i = 0; i < M; ++i)
 95     {
 96         Edge eg = edge[i];
 97         if (!ufsSame(eg.u, eg.v))
 98         {
 99             ufsUnion(eg.u, eg.v);
100             ans += eg.cost;
101         }
102     }
103     printf("%lld\n", ans);
104 }
105
106 int main()
107 {
108 #ifdef HOME
109     freopen("in", "r", stdin);
110     //freopen("out", "w", stdout);
111 #endif
112
113     scanf("%d %d", &N, &M);
114     for (int i = 0; i < M; ++i)
115     {
116         scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].cost);
117     }
118
119     Solve();
120
121 #ifdef HOME
122     cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
123     _CrtDumpMemoryLeaks();
124 #endif
125     return 0;
126 }

 
时间: 2024-10-20 00:11:04

最小生成树 之 CODE[VS] 1231 最优布线问题的相关文章

1231 最优布线问题

1231 最优布线问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接. 为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用. 输入描述 In

[CodeVS]1231 最优布线问题

主要算法:贪心:数据结构:并查集: 题目描述: 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的. 为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接.{裸的并查集} 为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省{贪心},让你编程计算这个最小的费用. 输入描述: 输入第一行为两个整数n,m(2<=n<=100000,2<=m&l

最小生成树——最优布线问题

最优布线问题(wire.cpp) [问题描述] 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来.两台计算机被连接是指它们间有数据线连接.由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的. 当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的.为了节省费用,我们采用数据的间接传输手段,即一台计算机可以间接的通过若干台计算机(作为中转)来实现与另一台计算机的连接. 现在由你负责连接这些计算机,任务是使任意两台计算机都连通(不管是直接的或间接的). [输入格

19.最优布线问题(kruskal算法)

最优布线问题(kruskal算法) 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接. 为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算

最小生成树Kruskal——最优布线问题(codevs 1231) (可做Kruscal模板)

题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接. 为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用. 输入描述 Input Description 输入第一行为两个整数n,m(2<=n<=100000,2<=m<

初学并查集-2:最优布线问题

题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接. 为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用. 输入描述 Input Description 输入第一行为两个整数n,m(2<=n<=100000,2<=m<

LSI设计(4)FOCR快速最优通道布线

 [email protected]   [摘要]本文提出的快速最优通道布线算法FOCR(Fast Optimal Channel Router)是Kernighan-shweikert-Persky 最优通道布线算法[2]和wada的改进布线算法[4]的改进.这些算法的"最优性"意义完全相同,但新算法的执行速度统计地比上述二种法远远为快. 1.引 言  通道布线算法是大规模集成电路(LSI)和印刷电路板(PCB)布线设计中广泛应用的一类算法,其特点是采用并行布线方式,因而与串行布线的

最小生成树prim算法

codevs.cn 最优布线问题 #include<cstdio>#include<cstring> bool u[101]; int g[101][101],minn[101]; int main(){ int n,m,q,p,total=0; scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) {  scanf("%d%d",&q,&p);  scanf("

bzoj 3545/3551: [ONTAK2010]Peaks -- 主席树,最小生成树,倍增

3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MB Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1. Input 第一行三个数N,M,Q.第二行N个数,第i个数为h_i接下来M行,每行