其实这俩题挺水的,团伙拿下了一血,但是感觉还是写一下博客比较好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. [Bzoj1767][Ceoi2009]harbingers (树上斜率优化)

    1767: [Ceoi2009]harbingers Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 451  Solved: 120[Submit][S ...

  2. Spring Cloud(9):Config配置中心

    Config配置中心作用简单来讲:统一配置,方便管理 开源配置中心: 1.百度Disconf 2.阿里Diamand 3.Spring Cloud Config 搭建Config-Server 快速上 ...

  3. Java的vector可实现自动增长的数组

    Vector维克多提供了向量类(vector)以实现类似动态数组的功能. 首先,在Java中并没有指针这样的概念 ,但如果正确灵活地使用指针又确实可以大大提高程序的质量.比如在c,c++中所谓的“动态 ...

  4. Failed to execute 'toDataURL' on 'HTMLCanvasElement,在canvas.toDataURL()执行时候报错解决方案

    添加跨域条件   crossorigin="anonymous" [Redirect at origin 'http://xxx.xx.com' has been blocked ...

  5. Meteor核心API

    在本教程中,我们将介绍学习Meteor核心API. 如果你想限制代码只在服务器或客户端可以使用下面的代码运行 - meteorApp.js if (Meteor.isClient) { // Code ...

  6. topcoder srm 610

    div1 250pt: 题意:100*100的01矩阵,找出来面积最大的“类似国际象棋棋盘”的子矩阵. 解法:枚举矩阵宽(水平方向)的起点和终点,然后利用尺取法来找到每个固定宽度下的最大矩阵,不断更新 ...

  7. 解决pycharm下安装reportLab报错的问题

    在利用pycharm中自带的第三方安装工具安装reportLab时提示安装失败.失败的原因是缺失第三方扩展包.经过查阅查阅资料了解到一些python的第三方扩展包是需要python-dev支持的.我装 ...

  8. HDU OJ u Calculate e

    这是一道简单的数学计算问题   主义好输出格式就好 #include<stdio.h> int main() { printf("n e\n- -----------\n&quo ...

  9. 偶遇HiWork,请不要擦肩而过

    非常多朋友可能都不了解HiWork,在这里介绍一下. HiWork是基于云存储的团队即时沟通协作平台,主要针对于中小团队及中小企业的即时沟通,让团队沟通更顺畅.在HiWork平台可即时得知所使用第三方 ...

  10. sshclientCRT连接linux使用技巧

    设置仿真和回滚缓冲区 字体外观设置 日志文件设置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fi ...