Kruskal 2015百度之星初赛2 HDOJ 5253 连接的管道

题目传送门

 1 /*
 2     最小生成树(Kruskal):以权值为头,带入两个端点,自然的排序;感觉结构体的并查集很好看
 3     注意:题目老头要的是两个农田的高度差,中文水平不好,题意理解成和平均值的高度差!
 4 */
 5 #include <cstdio>
 6 #include <algorithm>
 7 #include <cstring>
 8 #include <cmath>
 9 #include <vector>
10 #include <queue>
11 #include <set>
12 using namespace std;
13
14 const int MAXN = 1e3 + 10;
15 const int MAXM = 1e2 + 10;
16 const int INF = 0x3f3f3f3f;
17 int n, m;
18 int a[MAXN][MAXN];
19 vector<pair<int, int> > G[MAXM];
20 struct UF
21 {
22     int rt[MAXN*MAXN];
23     void init(void)    {memset (rt, -1, sizeof (rt));}
24
25     int Find(int x)    {return (rt[x] == -1) ? x : rt[x] = Find (rt[x]);}
26
27     void Union(int x, int y)
28     {
29         x = Find (x);    y = Find (y);
30         if (x > y)    rt[y] = x;
31         else if (x < y)    rt[x] = y;
32     }
33
34     bool same(int x, int y)    {return Find (x) == Find (y);}
35 }uf;
36
37 int Kruskal(void)
38 {
39     uf.init ();
40     int ans = 0;
41     for    (int i=0; i<=100; ++i)
42     {
43         for (int j=0; j<G[i].size (); ++j)
44         {
45             int u = G[i][j].first;    int v = G[i][j].second;
46             if (!uf.same (u, v))    {uf.Union (u, v);    ans += i;}
47         }
48     }
49
50     return ans;
51 }
52
53 int get_id(int i, int j)    {return (i - 1) * m + j;}
54
55 int main(void)        //2015百度之星初赛2 HDOJ 5253 连接的管道
56 {
57     int t, cas = 0;    scanf ("%d", &t);
58     while (t--)
59     {
60         scanf ("%d%d", &n, &m);
61         for (int i=0; i<=100; ++i)    G[i].clear ();
62
63         for (int i=1; i<=n; ++i)
64         {
65             for (int j=1; j<=m; ++j)
66             {
67                 scanf ("%d", &a[i][j]);
68                 if (i > 1)    {G[abs (a[i][j] - a[i-1][j])].push_back (make_pair (get_id (i, j), get_id (i-1, j)));}
69                 if (j > 1)    {G[abs (a[i][j] - a[i][j-1])].push_back (make_pair (get_id (i, j), get_id (i, j-1)));}
70             }
71         }
72
73         printf ("Case #%d:\n", ++cas);
74         printf ("%d\n", Kruskal ());
75     }
76
77     return 0;
78 }
79
80
81 /*
82 2
83 4  3
84 9 12 4
85 7 8 56
86 32 32 43
87 21 12 12
88 2  3
89 34 56 56
90 12 23 4
91 */
时间: 2024-08-05 19:06:16

Kruskal 2015百度之星初赛2 HDOJ 5253 连接的管道的相关文章

数学 2015百度之星初赛2 HDOJ 5255 魔法因子

题目传送门 1 /* 2 数学:不会写,学习一下这种解题方式:) 3 思路:设符合条件的数的最高位是h,最低位是l,中间不变的部分为mid,由题意可得到下面的公式(这里对X乘上1e6用a表示,b表示1e6) 4 (h*power+l+mid)*a = (l*power+h+mid)*b 5 可推得:mid = ((h*power+l) * a - (l*power+h) * b) / (a - b); 6 所以可以枚举h,l然后求mid,注意mid的最低位一定是0,因为留出最低位加l或者h 7

LIS 2015百度之星初赛2 HDOJ 5256 序列变换

题目传送门 1 /* 2 LIS(非严格):首先我想到了LIS,然而总觉得有点不对:每个数先减去它的下标,防止下面的情况发生:(转载) 3 加入序列是1,2,2,2,3,这样求上升子序列是3,也就是要修改2个,但是中间的两个2,变化范围又不能超过(1,3) 4 那么这样求的也就不对,但是减掉之后,相当于给中间重复的数留下了修改的空间 5 解释下为什么可以减而保持正确性:因为题目所求时严格递增,假设是2,3, 4,那么变成1, 1, 1,所以在LIS里非严格递增就可以了 6 这也是为什么要在upp

BFS 2015百度之星初赛2 HDOJ 5254 棋盘占领

题目传送门 1 /* 2 BFS:先把1的入队,每个1和它相邻的组合后看看能不能使0变1,若有则添加入队,change函数返回改变了多少个0 3 注意:结果还要加上原来占领的 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 #include <vector> 10 #include <queue> 11

二分搜索 2015百度之星初赛1 1003 序列变换

题目传送门 1 /* 2 二分搜索:在0-1e6的范围找到最小的max (ai - bi),也就是使得p + 1 <= a[i] + c or a[i] - c 3 比赛时以为是贪心,榨干智商也想不出来:( 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 #include <iostream> 10 using

二分查找 2015百度之星初赛1 1001 超级赛亚ACMer

题目传送门 1 /* 2 二分找到不大于m的最大的数,记做p,只要a[p] + k <= a[p+1]就继续 3 注意:特判一下当没有比m小的数的情况:) 4 */ 5 #include <cstdio> 6 #include <cstring> 7 #include <cmath> 8 #include <algorithm> 9 using namespace std; 10 11 typedef long long ll; 12 13 const

2015百度之星初赛2 1005 序列变换(LIS变形)

LIS(非严格):首先我想到了LIS,然而总觉得有点不对:每个数先减去它的下标,防止下面的情况发生:(转载) 3 加入序列是1,2,2,2,3,这样求上升子序列是3,也就是要修改2个,但是中间的两个2,变化范围又不能超过(1,3) 4 那么这样求的也就不对,但是减掉之后,相当于给中间重复的数留下了修改的空间 5 解释下为什么可以减而保持正确性:因为题目所求时严格递增,假设是2,3, 4,那么变成1, 1, 1,所以在LIS里非严格递增就可以了 6 这也是为什么要在upper_bound的位置插入

2015 百度之星初赛 1 2 2015ACM/ICPC亚洲区上海站 codeforces 851

A - 超级赛亚ACMer HDU - 5246 n m k m >=max( a[i] ); m < min(a[i]); 先判断掉 然后就可以找到最接近的 比m小的一个数 往上涨 看是否能行 O(n) #include<stdio.h> #include<string.h> #include<algorithm> #include<string> #include<iostream> #include<math.h>

2015百度之星初赛2 1004 魔法因子(暴力+数学)

Problem Description 有人说:人类是自己一步步进化的,而数学是上帝亲手创造的.度度熊最近也正沉醉于数学之美中,它发现了一种神奇的数字,取名曰:魔法因子. 将因子记为X,如果有一些整数与这些因子做乘法后,结果仍然是整数,同时,结果数字的首位和末位会换交换位置,而其他位置上的数字恰好不变!这时X被认为是一个魔法因子.需要注意的是,用来相乘的这些整数不会含有前导0,但是如果交换的结果有前导0,又恰好是乘法的结果,这时仍然认为X是这个整数的魔法因子.度度熊认为1不是个魔法因子,因为所有

2015 百度之星 初赛1 1001(贪心)

 Problem Description 百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度.?所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发斗志,实力提升.? 具体来说,就是百小度现在要接受一些ACMer的挑战了,这些ACMer有n个人,第i个人的战斗力是a[i]. ?百小度接下来可以自主安排与这n个ACMer的PK顺序,他要想在PK赛中赢过另外一个ACMer,就必须使得自己的战斗力不小于对方(平局情况他会按照百小度字典上的规则把自己排