魔法跳舞链 (最小生成树)

个人心得:周测的时候心情有点闷,看到就不想去做,比完后第二天拿着一做,这么简单,我也是醉了。

虽然最后一周了,但是我还是希望你能稳住别被其他事扰乱军心了,希望以后的你能够静下心去思考。

这题:就是用Kruskal算法第一遍找出最大值中的最小值,第二次再反过来用一次就好了。

这样阴沉的天气持续下去,我们不免担心起他的健康。

51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动。

N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的魔力连接起来,形成一个魔法阵。

魔法链是做法成功与否的关键。每一条魔法链都有一个魔力值V,魔法最终的效果取决于阵中所有魔法链的魔力值的和。

由于逆天改命的魔法过于暴力,所以我们要求阵中的魔法链的魔力值最大值尽可能的小,与此同时,魔力值之和要尽可能的大。

现在给定魔法师人数N,魔法链数目M。求此魔法阵的最大效果。

Input两个正整数N,M。(1 <= N <= 10^5, N <= M <= 2 * 10^5)

接下来M行,每一行有三个整数A, B, V。(1 <= A, B <= N, INT_MIN <= V <= INT_MAX)

保证输入数据合法。Output输出一个正整数R,表示符合条件的魔法阵的魔力值之和。Sample Input

4 6
1 2 3
1 3 1
1 4 7
2 3 4
2 4 5
3 4 6

Sample Output

12
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 int magic[100005];
 6 int n,m;
 7 struct power
 8 {
 9     int u,v,q;
10 }p[100005*2];
11 bool cmp(power a,power b){
12      return a.q<b.q;
13 }
14 void init()
15 {
16     for(int i=1;i<=n;i++)
17         magic[i]=i;
18 }
19 int getm(int x){
20    if(x!=magic[x])
21       magic[x]=getm(magic[x]);
22    return magic[x];
23 }
24 void marge(int x,int y){
25     int p=getm(x),q=getm(y);
26     if(p!=q)
27        magic[p]=q;
28 }
29 int main(){
30     scanf("%d%d",&n,&m);
31     init();
32     for(int i=1;i<=m;i++)
33         scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].q);
34         sort(p+1,p+m+1,cmp);
35         int maxn=0;
36         long long oo=0;
37         int flag=0;
38         for(int i=1;i<=m;i++){
39             if(getm(p[i].u)==getm(p[i].v)) continue;
40             marge(p[i].u,p[i].v);
41             if(maxn<p[i].q)
42             {
43                 maxn=p[i].q;
44                 flag=i;
45             }
46         }
47         init();
48         for(int i=m;i>=1;i--)
49         {
50             if(p[i].q>maxn) continue;
51             if(getm(p[i].u)==getm(p[i].v)) continue;
52             marge(p[i].u,p[i].v);
53             oo+=p[i].q;
54
55         }
56
57          printf("%lld\n",oo);
58
59   return 0;
60 }
				
时间: 2024-10-07 15:01:57

魔法跳舞链 (最小生成树)的相关文章

跳舞链解数独 静态数组优化

前几天有人问我之前写的那个跳舞链解数独的程序的内存泄漏问题如何解决,因此回顾了一下我的那个程序.现在看来那个程序简直不忍直视,于是大刀阔斧的改了.主要是把动态内存分配都改为了静态预分配,这样就可以避免频繁的调用malloc和free.同时静态分配的好处就是内存访问局部性比较好,cache不容易miss.而且在一行四个节点连续分配的情况下,就没有必要存储左右指针了.而且在连续分配的时候,指针都可以蜕变为数组索引,访问就比较简单了.还有一个好处就是整个程序可读性大大增强.现在这个版本的代码如下,利用

跳舞链 Dancing Links

作为搜索里面的一个大头,终于刷了一部分题目了,跳舞链一般都有现成的模板来套...... 至于跳舞链的学习的话,我觉得http://www.cnblogs.com/grenet/p/3163550.html 这一篇文章已经将的不能再详细了......就不多说了...... 对于DLX问题首先就是要构造一个01矩阵,然后再进行覆盖,行就是可选择的一些方案,而列是要被覆盖掉的东西,也就是要解决的问题.每个行,也就是每个方案都会覆盖一部分列,就是能够解决一部分问题.然后就是要想解决所有问题需要找到哪些行

HihoCoder1317 跳舞链

跳舞链 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近遇到一个难题,他需要破解一个棋局. 棋局分成了n行,m列,每行有若干个棋子.小Ho需要从中选择若干行使得每一列有且恰好只有一个棋子. 比如下面这样局面: 其中1表示放置有棋子的格子,0表示没有放置棋子. 对于上面这个问题,小Ho经过多次尝试以后得到了解为选择2.3.4行就可以做到. 但是小Ho觉得自己的方法不是太好,于是他求助于小Hi. 小Hi:小Ho你是怎么做的呢? 小Ho:我想每一行都只有两种状态

ACM知识点分类

ACM知识点分类  (红:完全没听说过 黄:听说过 绿:接触过做过题 蓝:很熟悉刷过专题 紫:见一道秒一道) 第一类:基础算法 (1)     基础算法:枚举,贪心,递归,分治,递推,构造,模拟 (2)     动态规划:背包问题,树形dp,状态压缩dp,单调性优化,插头dp (3)     搜索:dfs,bfs,记忆化搜索,优化与剪枝,双广,A*,IDA*,跳舞链 第二类:数据结构 (1)     简单数据结构:链表,栈和队列,串,树和二叉树,图,排序与检索 (2)     树形结构:线段树,

【置顶】ACM知识点分类

ACM知识点分类  (红:完全没听说过 黄:听说过 绿:接触过做过题 蓝:很熟悉刷过专题 紫:见一道秒一道) 第一类:基础算法 (1)     基础算法:枚举,贪心,递归,分治,递推,构造,模拟 (2)     动态规划:背包问题,树形dp,状态压缩dp,单调性优化,插头dp (3)     搜索:dfs,bfs,记忆化搜索,优化与剪枝,双广,A*,IDA*,跳舞链 第二类:数据结构 (1)     简单数据结构:链表,栈和队列,串,树和二叉树,图,排序与检索 (2)     树形结构:线段树,

[其他][转载]ACM知识点分类

转自:https://www.cnblogs.com/Running-Time/p/4737878.html 第一类:基础算法 (1)     基础算法:枚举,贪心,递归,分治,递推,构造,模拟 (2)     动态规划:背包问题,树形dp,状态压缩dp,单调性优化,插头dp (3)     搜索:dfs,bfs,记忆化搜索,优化与剪枝,双广,A*,IDA*,跳舞链 第二类:数据结构 (1)     简单数据结构:链表,栈和队列,串,树和二叉树,图,排序与检索 (2)     树形结构:线段树,

DLX精确覆盖与重复覆盖模板题

hihoCoder #1317 : 搜索四·跳舞链 原题地址:http://hihocoder.com/problemset/problem/1317 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 小Ho最近遇到一个难题,他需要破解一个棋局. 棋局分成了n行,m列,每行有若干个棋子.小Ho需要从中选择若干行使得每一列有且恰好只有一个棋子. 比如下面这样局面: 其中1表示放置有棋子的格子,0表示没有放置棋子. 对于上面这个问题,小Ho经过多次尝试以后得到了解为选

NIOP 09 题解

2009 NOIP 提高组 题解 这次考试,呃,除了第一题就没怎么拿分.后面几道题都比较难想,想到了又不怎么写的出来,哎. 几道题总的难度都不是很大,总结最近几次做题来说,在图论上只是还是很欠缺,做题都不怎么会去想图论方面的知识,但其实只要能想到用图论知识的话最近的几道题都还是很好处理的.假期要在复习一遍图论了. 这次的题主要是读懂题. T1 潜伏者 T2 Hankson的趣味题 T3 最优贸易 T4 靶形数独 T1 额,该怎么判断怎么判断吧.旁边的cyy同学认为推出25个字母的密码可以自行推出

个人项目——最后篇

一.实现过程: 首先这个项目我把求解和生成分开写了,生成函数我用回溯法+规则变换来生成终局.先用随机数加回溯生成一个终局,再通过这个终局交换行.列.数字生成1372个终局.这样共需要随机回溯生成1000个左右终局即可.实现过程用了5个函数,分别是dfs回溯生成函数,一个初始化函数,一个随机填数函数,一个变换函数,一个打印函数.dfs函数从1到81号格子填数,然后填的数由随机填数函数决定.一直填满最后判断是否合格,再回溯.再根据这个终局先交换两行,再交换两列最后交换两个数字的方式构造1372个终局