!HDU 4313 破坏导弹攻城计划-连通图-(最小生成树变形)

HDU 4365 正方形格子涂色中心对称轴对称的涂法有多少种-思维-(矩阵坐标关系&快速幂取模) 题意:n*n的格子,涂色,有k种颜料,必须满足旋转任意个90度和翻转之后图片的样子不变,现在已经有m个格子涂过色了,问还有多少种涂法满足上述条件。 分析: 满足上述对称条件,那么涂色的种类问题我们可以放在正方形的一个角来做,因为一个角确定了其他角的颜色也就确定了。 以左上角的下半角为例。共有1+2+....+(n+1)/2个格子,然后记录涂过色的格子对应到这个三角形里的格子数目,用tot来记 阅读详情

题意:有n个城市,城市之间有n-1条路连接每个城市,也就是说有一个树,敌人在一些城市放了导弹,共有m个导弹,敌人想把导弹运到一起然后开战,现在给你个任务就是摧毁一些路,使任何两个导弹都不能运到一起,摧毁每条路都有相应的代价,求最小的代价。

分析:

导弹不能运到一起就是说任何两个导弹不能在一个连通图中,所以我们的任务就是用最少的代价摧毁一些路使m个导弹分别在m个连通图中。

这题是就反面,最少的代价,那么就是剩下的路的代价越大越好,这就是最大生成树,所以解题方法是:用Kruskal算法求最大生成树,用并查集来维护两个导弹不能在一个连通图中。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int fa[100005],n,m,t;
struct node{
	int x,y;
	long long v;
}edge[100005];
int k[100005];
long long sum;
bool cmp(node a,node b)
{
	return a.v>b.v;
}
int find(int x)
{
	if(fa[x]==x) return x;
	else return fa[x]=find(fa[x]);
}
void merge(int x,int y)
{
	fa[find(x)]=find(y);
}
void kruskal()
{
	for(int i=0;i<n-1;i++){
		int fax=find(edge[i].x);
		int fay=find(edge[i].y);
		if(k[fax]&&k[fay]){
			sum+=edge[i].v;
			continue;
		}
		else{
			if(k[fax]||k[fay]) k[fax]=k[fay]=1;
			merge(fax,fay);
		}
	}
}
int main()
{
	cin>>t;
	while(t--){
		memset(k,0,sizeof(k));
		cin>>n>>m;
		for(int i=0;i<n;i++) fa[i]=i;
		for(int i=0;i<n-1;i++) cin>>edge[i].x>>edge[i].y>>edge[i].v;
		int tmp;
		for(int i=0;i<m;i++){
			cin>>tmp;
			k[tmp]=1;
		}
		sort(edge,edge+n-1,cmp);
		sum=0;
		kruskal();
		cout<<sum<<endl;
	}
}


HDU 4336 集齐方便面卡片的期望-期望dp 或 容斥原理 -(二进制压缩辅助) 题意:要集齐n种卡片,现已知每打开一袋方便面得到每种卡片的概率Pi,Pi的和小于等于1,求集齐这n种卡片需要买的方便面的期望。 分析: 一、期望dp,这题要用二进制压缩,这是很显然的。 状态:dp[i]现在已经收集了i种卡片到达收集所有卡片的期望。这个状态能转移到的状态有:1).dp[i](下次打开的方便面得到的卡片是已经收集过的);2).dp[i|(1 所以方程:dp[i]=Pi * d 阅读详情

相关推荐

HDU 4312 最小切比雪夫距离-转化成曼哈顿距离再分治

题意:二维空间,n个点,求以某点为起点到各点的最小切比雪夫距离 分析: 上一道题之前已经用“分治“思想在O(n)的时间内求出了n个点,以某点为起点到各点的最小曼哈顿距离,那么我们根据二维空间切比雪夫距离和曼哈顿距离的关系,可以把切比雪夫距离转化成曼哈顿距离,再直接用之前的方法即可。 二维空间: 曼哈顿距离 :d=|x1-x2|+|y1-y2|,到某点的曼哈顿距离为r的点组成一个边长为√2*

关于学习本身 2721

HDU 4313 最小生成树

题解 : 这个题目我们可以把边的权值从大到小排序 ,为什么这样排序呢,因为在排序的时候我们可以按照从大到小依次将边加入到最小生成树中去,加入进去后我们可以发现一个,当两个点连载一起时候加入的那条边就是要删去的边 因为这是这两个点之间最小的一条边。 还需要注意在合并的时候我们必须保证根节点是要被破坏的点这样就可以了 具体实现看代码了#include <iostream> #include <cstri

Glory 的 博客 284

hdu-4313-并查集

http://acm.hdu.edu.cn/showproblem.php?pid=4313 题意,给你一个n点,n-1条边的图 给你k个点, 要求删除一些边使得k个点完全不连通 求删除边集的最小价值 又是这种删边的问题,可以逆向地用并查集处理 正向地一条条删边是很麻烦的,如果我们逆过来,从头构图,把边按权值由大到小排序,每次选一条边,看加入 其后【是否导致 K

缺氧 349

hdu4313 Matrix(kruskal思想+并查集)

题意: 给定一棵n个节点的树,树边有边权 现在有k个坏点,要求删除树中若干条边,满足k个坏点两两不连通,问删除的最小边权和是多少 数据范围:n<=1e5 解法: 反过来想,将问题转化为计算能保留的最大边权和 根据kruskal算法思想贪心地对边按边权从大到小排序,然后遍历, 如果当前边不会令两个坏点相连那么可以保留,否则必须删 累加必须删的边的边权就能得到答案。 判断连接之后是否会使两个坏点相连可以用带权并查集维护连通块内坏点数量 code: #include<bits/stdc++.h>

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 224

HDU 4313 Matrix

人一我百人十我万!!! 一开始想用最短路来求…结果发现节点好多。。。 发现是最小生成树里面的克鲁斯卡思想,加一些贪心就好了。 ac code:#include #include #include #include #include #include #include #include #include #include #include #inc

Stray_Lambs的博客 344

hdu 4313 Matrix (kruskal模板题,cmp倒着取边)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4313 题意:有n个城市,有n-1条边连通,其中的k个城市有破坏机器,要求切断部分路,使得这k个城市之间不能连通,每条路对应不同的花费时间,求最少花费。 思路:以含“破坏机器”的城市作为根结点,分为k棵树,每加入一条边,判断该边的两个端点所对应的祖先是不是都含“机器”,若都含不连这条边直接在ans上加,...

hxc2101的博客 242

【最小割】【图的点连通度】破坏

【题目描述】 一个图有n个点,m条边(有向边),要从起点1到终点n。破坏中间的一些点,使得从起点 到终点经过的边数必须大于k条。求最少要破坏多少个点。 起点和终点是不能被破坏的。数据保证不存在起点到终点的边。 注:起点和终点不连通视为距离无穷大。 【输入】 第一行读入三个正整数n,m,k。n表示点的个数,m表示边的条数,k表示从起点到终点经过 的边数必须大于k条。 接下来m行,每行

每天心塞一点点 1083

HDU 4313

这个题有两种做法 1.并查集 初始时一条边都不加,将所有边按权值从大到小排序,然后依次判断每一个边两端的顶点是否是均为machine节点,如果是则应删除这条边,否则加入这条边,然后在并查集合并时尽量让根节点为machine节点。 #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;cstdlib&gt; #include&lt...

yuanlanjun 187

hdu 4313 Matrix

Problem Description Machines have once again attacked the kingdom of Xions. The kingdom of Xions has N cities and N-1 bidirectional roads. The road network is such that there is a unique path betw

zy_sarah的专栏 2296

HDU 4313 Matrix(贪心+并查集)

HDU 4313 题意: 有n个节点,n-1条边,其中k个节点为危险节点,有大规模杀伤性武器,切断哪些路能使得这些大规模杀伤性武器的危险节点之间彼此不连通,且切断的边权值之和最小。 思路: 初始化每个节点为一个集合,并记录每个集合中危险节点的数目(0或1)。 要实现权值之和尽可能的小,则要权值尽可能小,故先将n-1条边按权值先升序排序。 排序后枚举这些边: 若边的两端节点所在集合

a novice 920

[BZOJ2177][最小/最大(曼哈顿距离)生成树]曼哈顿最小生成树

题意给定平面内一些点,求最小曼哈顿距离生成树看这篇咯http://blog.csdn.net/acm_cxlove/article/details/8890003#include <cstdio> #include <string> #include <cstring> #include <iostream> #include <algorithm> #define N 100010 #define

CE玩家 2569

HDU 4313 Matrix (最小生成树

Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3077 Accepted Submission(s): 1194 Problem Description Machines have once again at

jingttkx的专栏 415

hdu4313(图,和最小生成树类似)

Description Machines have once again attacked the kingdom of Xions. The kingdom of Xions has N cities and N-1 bidirectional roads. The road network is such that there is a unique path b...

weixin_30423977的博客 168

HDU 4313 并查集

点击打开链接 题意:给一个城镇的图,有m个城镇上是有敌兵的,为了将所有敌兵的联系隔断,需要删除的所有边的最小的权值 思路:看了就知道是并查集Kruskal思想的题,我们将边的权值从大到小向里面加,如果我要加的这条变加进去之后,敌兵可以相连,那么这条边肯定要删下去,而我们从大到小加的边,所以肯定是最小的,因为可以的边我们都用上了嘛#include #include #include

Dan__ge的博客 3545

HDU4313- Matrix - 树状DP Version 思路+解题报告+AC代码【0.4%达成】

#include #include #include #include #include using namespace std; /** Problem: HDU4313 - Matrix - DP Version【0.4%达成】 Copyright : 归我们学校集训队和本人所有,未经同意可以转载。 【但是胆敢用于培训的话,贵学校服务

c0de4fun的完美算(nei)法(he)教室-我们仍不知道,那天调用的驱动的名字。 2799

HDU4313Matrix(Kruskal算法求解)

Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3538    Accepted Submission(s): 1405   Problem Description Machines have once again a...

逐梦者 401

HDU 4311 最小曼哈顿距离-思维&卡时间-(横纵坐标分开算,排序)

题意:有n个点,求以这n个点中的某一点为起点,到各点的曼哈顿距离和最小是多少 分析: 暴力枚举又要超时,这种题一般都是考思维了,多半都是用技巧找到一个高效的方法。个人觉得这题跟上一篇文章的题是一个类型。 这题也是用“分治”,虽说题目要求的是曼哈顿距离,但是我们为什么真的就要一步到位的求呢,可以横纵坐标分开求,先x排序,然后遍历一遍,求出横坐标的距离,然后y排序,遍历一遍求出坐标的距离加在刚才

关于学习本身 3942

HDU 5344 多个数的和异或-思维-(位运算)

题意:n个数的两两做和,然后异或 分析: 异或的性质:两个相同的数异或为0,所以Ai+Aj异或Aj+Ai等于0,所以最终结果就是Ai+Ai的异或 代码: #include long long t,n,m,z,l; long long a[1000005]; int main() { scanf("%I64d",&t); while(t--){ scanf("

关于学习本身 3048
上一篇: HDU 4312 最小切比雪夫距离-转化成曼哈顿距离再分治
下一篇: HDU 4343 多查询求区间内的最大不相交区间个数-思维&贪心-卡时间&二分&剪枝
AC_0_summer
博客等级 码龄12年 13粉丝 204原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值