warfare(最大生成树裸题)
战争
【问题描述】
在2240年,一场巨大的战争在地球联合力量(EAF)与火星联盟(MF)之间展开。至今,双方势均力敌。因最近的一次经济危机,资源紧缺,EAF将被MF勒要更多领土。为此,EAF决定采取战争以来最重要的行动:发动对分散在MF上各处的基地进行同时攻击。EAF的力量大都是mechs——大型两足跛行车,有飞行功能。
典型的MF基地概况如下:构成基地的房屋地跨一到两块领土。每块领土被保护塔产生的穿不透的能量层所笼罩,以免于外来袭击。这些保护塔围绕在领土周围起保护作用。
每座保护塔通过建造在地面上的水道与至少一座塔相联系。当那些相联系的塔围成一圈,它们产生能量层。否则能量层消失。
MF知道如果能量层消失,基地将很容易被EAF的力量侵占,因此,被水道相连的两座塔保护水道免受军事袭击。每座塔有防御功能,能拆卸指定数量的mechs,每个水道在坍塌之前能解决特定数量敌方mechs的袭击。这个数量由水道连接的两塔能拆卸的总数量决定。两座塔不能被一个以上的水道相连。
但是,袭击塔一边的水道不减少塔在另一边能拆卸的mechs的数量。因为这次行动是突袭,所有的对水道的袭击都必须同时,所有水道同时坍塌瓦解。
所有能量层必须废除才算毁灭了一个MF基地。破坏所有水道能达此目的,但也将需要很多mechs 牺牲。EAF只有很少的力量花费了,必须最有效率地部署mechs。
你被赋予这任务,写程序:使EAF胜利。给定一幅保护塔的曲线图,决定哪些水道要被破坏,来使所有能量层消失,要求战斗中牺牲最少的mechs。
【输入格式】
第一行为一个整数m,2 < m <= 100,代表塔的数量。
以下2m行,对于每个塔都有两行输入:
◎一行包含三个正整数i(0 <= i <= m-1),ui(1 <= ui <= 50),ci(1 <= ci <= m-1):每个塔的身份标识、可以摧毁的mechs的数量和与它相连的河道的数量。两个整数间用一个空格隔开。
◎一行包含ci个不同的正整数,代表和塔i连接的塔。一个塔不能连接到它自己,两个整数间用一个空格隔开。
该防御体系至少能够生成一个能量层。 不一定所有的塔连通。
【输出格式】
一行一个整数,代表EAF摧毁所有能量层所需要消耗的最少数量的mechs。
【输入样例】
3
0 1 2
1 2
1 2 2
0 2
2 3 2
0 1
【输出样例】
3
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int c,m,l,fa[];
int a[],b[],d[],z[];
long tot=,total=;
int find(int x){
if (fa[x]==x) return x; else return fa[x]=find(fa[x]);
}
void sort(int l,int r){
int i=l,j=r,mid=d[(l+r)/];
while (i<=j){
while (d[i]>mid) i++;
while (d[j]<mid) j--;
if (i<=j){
swap(a[i],a[j]);
swap(b[i],b[j]);
swap(d[i],d[j]);
i++;j--;
}}
if (i<r)sort(i,r);
if (l<j)sort(l,j);
}
void add(int x,int y,int z){
a[++tot]=x;
b[tot]=z;
d[tot]=y;
}
int main(){
int i,j,s,t,n,x,y; freopen("warfare.in","r",stdin);
freopen("warfare.out","w",stdout); scanf("%d",&n);
for (i=;i<n;i++){
scanf("%d%d%d",&m,&l,&c);
for (j=;j<c;j++){
scanf("%d",&s);
add(m,l,s);
total=total+l;
}
z[m]=l;
}
for (i=;i<=tot;i++) fa[i]=i;
sort(,tot); for (i=;i<=tot;i++){
x=find(a[i]);
y=find(b[i]);
if (x!=y){
fa[x]=y;
total=total-(z[a[i]]+z[b[i]]);
}
}
printf("%d",total);
return ;
}
代码
首先先说一下这一题,这是一题很裸的最大生成树,应该算是在初学时还不错的一题吧,依旧是根据最大生成树的原理很容易YY的 感觉打这题不太好打的地方,其实也是在我学最大生成树时最不理解的地方,应该是什么时候开始加边,什么时候不加边 这个问题应该是让我想了很久,之后再学习并查集的原理之后,打了一题并查集的裸题才有所体会(这一点也让我倍感在学习新的知识的时候,刷裸题的重要性啊),貌似是在看到并查集的第二个步骤:合并,的时候有种很像是明白也什么的样子 之后就意识到,条件就是判断是否已构成一棵树,讲的很白一点就是,判断某条边的两个端点是否有同一个祖先,如果没有,那么就合并,并用总的边权值减去该边(当然这是因题来说) 再啰嗦一下吧,自己还是很不注意循环的起始0.,唔。。这个不好的习惯要改嗯,其实这里也可以用sort,定义一个数组就可以实现= =自己懒得改了,下次有机会再用吧 这题对我来说还是蛮有意义的,是本蒟蒻学习图论的一个好的开始嗯,之前没有学的东西也是时候该认真学~\(≧▽≦)/~啦啦啦.....打算月考完,继续学习图论,把最短路问题学完,再把队列部分过一遍,之后还是继续刷长乐的题,复习复习算法,碰到新的东西趁机学一学嗯 = =还是没忍住等到月考之后再发题解orz....祝第一次月考顺利
warfare(最大生成树裸题)的更多相关文章
- 【填坑】bzoj3224 splay裸题
人生第一道splay不出所料是一道裸题,一道水题,一道2k代码都不到的题 #include <cstdio> ,n,p,q; ],c[][],size[],sp[]; void rot(i ...
- tarjan讲解(用codevs1332(tarjan的裸题)讲解)
主要借助这道比较裸的题来讲一下tarjan这种算法 tarjan是一种求解有向图强连通分量的线性时间的算法.(用dfs来实现) 如果两个顶点可以相互通达,则称两个顶点强连通.如果有向图G的每两个顶点都 ...
- LCT裸题泛做
①洞穴勘测 bzoj2049 题意:由若干个操作,每次加入/删除两点间的一条边,询问某两点是否连通.保证任意时刻图都是一个森林.(两点之间至多只有一条路径) 这就是个link+cut+find roo ...
- 贴一下WC总结里提到的那道裸题吧。。。
[bzoj4034][HAOI2015]T2 试题描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 ...
- HDU 1102 最小生成树裸题,kruskal,prim
1.HDU 1102 Constructing Roads 最小生成树 2.总结: 题意:修路,裸题 (1)kruskal //kruskal #include<iostream> ...
- hdu Flow Problem (最大流 裸题)
最大流裸题,贴下模版 view code#include <iostream> #include <cstdio> #include <cstring> #incl ...
- POJ 3468 线段树裸题
这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...
- POJ 2195 Going Home 最小费用流 裸题
给出一个n*m的图,其中m是人,H是房子,.是空地,满足人的个数等于房子数. 现在让每个人都选择一个房子住,每个人只能住一间,每一间只能住一个人. 每个人可以向4个方向移动,每移动一步需要1$,问所有 ...
- lightoj 1094 Farthest Nodes in a Tree 【树的直径 裸题】
1094 - Farthest Nodes in a Tree PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...
随机推荐
- CSS浏览器兼容性问题集()两
11.非常适合 高度适合于被改变时所述内目标高度的外层的高度不能自己主动调节,尤其是排队对象时margin 要么paddign 时. 例: #box {background-color:#e ...
- 沃森Mysql数据库修复工具
华信Mysql数据库修复程序是由北京华信数据恢复中心独立研发.主要针对Mysql数据库损坏的恢复. 本程序可用于因为各种误操作而导致数据丢失的恢复,以及因为断电.陈列损坏.硬盘坏道等各种原因导致数据库 ...
- ubuntu文本界面乱码的中国解决方案
问题: 文本界面乱码中国 解决方式: 非常easy.安装fbterm就OK! 详细例如以下: 安装命令:sudo apt-get install fbterm xfonts-xqy 然后执行:sudo ...
- MvcOptions配置
MvcOptions配置 程序模型处理 IApplicationModelConvention 在MvcOptions的实例对象上,有一个ApplicationModelConventions属性(类 ...
- 终于会用c#中的delegate(委托)和event(事件)了
一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和e ...
- 豆瓣api之OAuth认证
豆瓣api通过OAuth允许第三方应用访问用户数据,所以OAuth认证就是我们整个project的基础了. OAuth认证听起来挺神秘,其实挺简单的. 现在的大型网站的开放平台的认证几乎都是采用OAu ...
- 【转】传递给Appium服务器以开启相应安卓Automation会话的Capabilities的几点说明
原文地址:http://blog.csdn.net/zhubaitian/article/details/39431307 Desired Capabilities是由客户端发送给Appium服务器端 ...
- 泛型委托及委托中所涉及到匿名方法、Lambda表达式
泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...
- STL源代码分析——STL算法sort排序算法
前言 因为在前文的<STL算法剖析>中,源代码剖析许多,不方便学习,也不方便以后复习.这里把这些算法进行归类,对他们单独的源代码剖析进行解说.本文介绍的STL算法中的sort排序算法,SG ...
- Android开发之Mediaplayer
Android提供了常见的音频.视频的编码.解码机制.借助于多媒体类MediaPlayer的支持,开发者能够非常方便在在应用中播放音频.视频.本篇博客主要解说在Android平台下怎样播放一个音频文件 ...