其实这俩题挺水的,团伙拿下了一血,但是感觉还是写一下博客比较好x。

一、团伙

题目描述

1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是:

我朋友的朋友是我的朋友;

我敌人的敌人也是我的朋友。

两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的信息,问你最多有多少个强盗团伙。

输入输出格式

输入格式:

输入文件gangs.in的第一行是一个整数N(2<=N<=1000),表示强盗的个数(从1编号到N)。 第二行M(1<=M<=5000),表示关于强盗的信息条数。 以下M行,每行可能是F p q或是E p q(1<=p q<=N),F表示p和q是朋友,E表示p和q是敌人。输入数据保证不会产生信息的矛盾。

输出格式:

输出文件gangs.out只有一行,表示最大可能的团伙数。

输入输出样例

输入样例#1: 复制

6
4
E 1 4
F 3 5
F 4 6
E 1 2
输出样例#1: 复制

3

普普通通的并查集维护关系题,只是需要在“敌人的敌人也是朋友”上另加处理。
对于这层关系,我们可以另加一个数组next[],输入敌人关系时,
我们记录一下,当再输入到当前敌人的敌人信息时,就可以进行合并了。 code
 #include<cstdio>
#include<algorithm>
#include<iostream> using namespace std; int n,m,cnt;
int f[],next[]; int getf(int x)
{
if(x==f[x]) return x;
else return getf(f[x]);
} void merge(int x,int y)
{
int pp=getf(x);
int qq=getf(y);
if(pp!=qq) f[qq]=pp;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) f[i]=i;
for(int i=;i<=m;i++)
{
char opt;
int x=,y=;
cin>>opt;
scanf("%d%d",&x,&y);
if(opt=='F')
merge(x,y);
if(opt=='E')
{
if(next[x]) merge(y,next[x]);
if(next[y]) merge(x,next[y]);
next[y]=x,next[x]=y;
}
}
for(int i=;i<=n;i++)
if(f[i]==i) cnt++;
printf("%d",cnt);
return ;
}

 二、口袋的天空

我们看一看就知道这是生成树,但是与一般问题不同,这是在求k个生成树。
回顾Kruskal算法,我们可以相似地把这些边进行排序。不妨这样想:开始n个点都是独立的,他们可以近似看为n
个生成树。之后我们再一点点连边,减少生成树的数量直到k个就退出。 code
 #include<cstdio>
#include<algorithm> using namespace std;
typedef long long ll; int n,m,k,x,y,z,tot,cnt;
ll ans;
int fa[];
struct node{
int f,t,v;
}edge[]; bool cmp(node a,node b)
{
return a.v<b.v;
} int getf(int x)
{
if(x==fa[x]) return x;
else return getf(fa[x]);
} int main()
{
scanf("%d%d%d",&n,&m,&k);cnt=n;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
edge[++tot].f=x;edge[tot].t=y;edge[tot].v=z;
edge[++tot].f=y;edge[tot].t=x;edge[tot].v=z;
}
sort(edge+,edge+tot+,cmp);
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<=tot;i++)
{
int pp=getf(edge[i].f);
int qq=getf(edge[i].t);
if(pp!=qq)
fa[qq]=pp,cnt--,ans+=edge[i].v;
if(cnt==k) break;
}
// printf("%d~~~~\n",cnt);
if(cnt<k) printf("No Answer");
else printf("%lld",ans);
return ;
}

 

Luogu P1195/P1892 口袋的天空/BOI团伙 【最小生成树/并查集】By cellur925的更多相关文章

  1. 【Luogu P2024&P1892】食物链&团伙(并查集拓展域)

    Luogu P1892 Luogu P2024 这两道一眼看过去很容易发现可以用并查集来做--但是当我们仔细阅读题面后,会发现其实并没有那么简单. 我们知道并查集可以很轻松地维护具有传递性的信息,也就 ...

  2. 洛谷 P1195 【口袋的天空】

    P1195 传送门 大体题意: 就是给你\(n\)个点\(m\)条边, 然后让你把这几个点连成\(k\)个部分. 解题思路: 很容易就可以想到生成树(别问我怎么想到的). 因为最小生成树中有一个判断 ...

  3. 洛谷 P1892 [BOI2003]团伙(并查集)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P1892 通过读题可以很清楚的发现这是一个并查集的题,并且要有两个集合: 若他们p和q是朋友,则存入第 ...

  4. 【洛谷】P1892 团伙(并查集)+ 求助

    题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友. 两个强盗是同一团伙的 ...

  5. Luogu P1196 [NOI2002]银河英雄传说:带权并查集

    题目链接:https://www.luogu.org/problemnew/show/P1196 题意: 有30000个战舰队列,编号1...30000. 有30000艘战舰,编号1...30000, ...

  6. BZOJ 1370 [Baltic2003]Gang团伙:并查集【虚点】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1370 题意: 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: (1)我 ...

  7. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]

    题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...

  8. Luogu 1525 【NOIP2010】关押罪犯 (贪心,并查集)

    Luogu 1525 [NOIP2010]关押罪犯 (贪心,并查集) Description S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨 ...

  9. P1195 口袋的天空

    P1195 口袋的天空 题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关 ...

随机推荐

  1. webpack-Modules(模块)

    模块(Modules) 在模块化编程中,开发者将程序分解成离散功能块(discrete chunks of functionality),并称之为模块. 每个模块具有比完整程序更小的接触面,使得校验. ...

  2. jsoncpp的api简要说明

    1  jsoncpp的api简要说明 1,解析(json字符串转为对象) std::string strDataJson; Json::Reader JReader; Json::Value JObj ...

  3. JIRA运行太慢,修改JVM

    JIRA运行太慢,根据实际实况,修改JVM内存大小 2. 非NT服务修改JVM内存大小 修改%JIRA_HOME%/bin下面的setenv.bat文件,修改JAVA_OPTS这个环境变量 set J ...

  4. Opengl ES 1.x NDK实例开发之七:旋转的纹理立方体

    开发框架介绍请參见:Opengl ES NDK实例开发之中的一个:搭建开发框架 本章在第六章(Opengl ES 1.x NDK实例开发之六:纹理贴图)的基础上绘制一个旋转的纹理立方体,原理和纹理贴图 ...

  5. Cts框架解析(6)-任务的运行

    前两篇讲了任务的加入和9大项配置,这篇讲任务的运行. 任务的运行 任务的运行在CommandScheduler的run方法中,所以删除全部的断点,在run方法中打上断点,重新启动启动debug: 先看 ...

  6. my-small.cnf my-medium.cnf my-large.cnf my-huge.cnf

    my-small.cnf my-medium.cnf my-large.cnf my-huge.cnf 是 MySQL 默认的几个配置文件.针对不同配置的服务器可以使用不同的配置文件,将你需要的那一个 ...

  7. MySQL运行计划不准确 -概述

    为毛 MySQL优化器的运行计划 好多时候都不准确,不是最优的呢(cpu+io)??? 因素太多了:: 存在information_schema的信息是定期刷新上去的,好多时候不是最真的,甚至相差好大 ...

  8. C# MVC 枚举转 SelectListItem

    <span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif; background-color: r ...

  9. #include &quot;*.c&quot;文件的妙用

    今天我在看代码的时候突然看到在一个.c文件里包括了#include "*.c"代码,这个让我非常诧异,然后google了一下.才发现是这么回事情.以下我写了一个測试代码.我相信你看 ...

  10. 2016/5/6 thinkphp ①框架 ② 框架项目部署 ③MVC模式 ④控制器访问及路由解析 ⑤开发和生产模式 ⑥控制器和对应方法创建 ⑦视图模板文件创建 ⑧url地址大小写设置 ⑨空操作空控制器 ⑩项目分组

    真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格不一样) 项目稳 ...