其实这俩题挺水的,团伙拿下了一血,但是感觉还是写一下博客比较好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. mongodb按照日期分组统计

    目录 1.使用时间格式化方法 2.进行时间补偿(默认当前时区是东八区,即8x3600x1000=28800000) mongodb的默认时间是格林尼治时间,如果是要按照日期进行分组需要注意!!!. 解 ...

  2. win7 休眠功能的开启与关闭

    1. 打开控制面板得下面目录,编辑计划设置

  3. Eclipse luna 装不上 veloeclipse

    今天在Eclipse中始终无法安装veloeclipse ,报错:Failed to prepare partial IU: [R]com.googlecode.veloeclipse.ui 2.0. ...

  4. Effective C++ Item 27 少做转型操作

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie todo Item34 旧式转型 (T) expression 或 T (expressio ...

  5. oracle统计信息

    手工刷ORACLE统计信息  select count(1) from LOG_TRX_DETAIL;  select * from user_tab_statistics where table_n ...

  6. [外文理解] DDD创始人Eric Vans:要实现DDD原始意图,必须CQRS+Event Sourcing架构。

    原文:http://www.infoq.com/interviews/Technology-Influences-DDD# 要实现DDD(domain drive  design 领域驱动设计)原始意 ...

  7. mount: wrong fs type

    # mount -t nfs -o nolock 192.168.1.84:/home/jason/filesys /mnt/nfsmount: wrong fs type, bad option, ...

  8. 最新Bootstrap手册

    http://www.jqhtml.com/bootstraps-syntaxhigh/index.html

  9. 【大数据project师之路】Hadoop——MapReduce概述

    一.概述. MapReduce是一种可用于数据处理的编程模型.Hadoop能够执行由各种语言编写的MapReuce程序.MapReduce分为Map部分和Reduce部分. 二.MapReduce的机 ...

  10. Num 36 : ZOJ 2100 [ 深度优先搜索算法 ] [ 回溯 ]

    该题是用回溯法来解决的题: 题目: Seeding Time Limit: 2 Seconds      Memory Limit: 65536 KB It is spring time and fa ...