ABC157 D - Friend Suggestions 题解

2025美赛E题为农业留出空间(附代码+全保姆教程)Making Room for Agriculture 有机农业的核心在于减少化学投入,促进自然控制和可持续性。变量定义CCC: 作物种群III: 害虫种群PPP: 天然捕食者种群(蝙蝠、鸟类等)BBB: 生物多样性水平(以种类数量表示)SSS: 土壤健康指数(影响植物繁殖与作物生长)EEE: 农业生态系统的整体稳定性。 阅读详情

D - Friend Suggestions

Time Limit: 2 2 2 sec / Memory Limit: 1024 1024 1024 MB / Score: 400 400 400 points

题意

An SNS has N N N users - User 1 1 1, User 2 2 2, ⋯, User N N N.
Between these N N N users, there are some relationships - M M M friendships and K K K blockships.
For each i = 1 , 2 , ⋯ , M i = 1,2,⋯,M i=1,2,⋯,M, there is a bidirectional friendship between User A i A_i Ai​ and User B i B_i Bi​.
For each i = 1 , 2 , ⋯ , K i = 1,2,⋯,K i=1,2,⋯,K, there is a bidirectional blockship between User C i C_i Ci​ and User D i D_i Di​.
We define User a a a to be a friend candidate for User b b b when all of the following four conditions are satisfied:

  • a ≠ b a≠b a=b.
  • There is not a friendship between User a a a and User b b b.
  • There is not a blockship between User a a a and User b b b.
  • There exists a sequence c 0 , c 1 , c 2 , . . . , c L c_0, c_1, c_2, ..., c_L c0​,c1​,c2​,...,cL​ consisting of integers between 1 1 1 and N N N (inclusive) such that c 0 = a c_0=a c0​=a, c L = b c_L=b cL​=b, and there is a friendship between User c i c_i ci​ and ci+1 for each i = 0 , 1 , ⋯ , L − 1 i = 0,1,⋯,L−1 i=0,1,⋯,L−1.

For each user i = 1 , 2 , . . . , N i = 1,2,..., N i=1,2,...,N, how many friend candidates does it have?

约束

  • 输入中所有数都是整数。
  • 2 ≤ N ≤ 1 0 5 2\le N\le 10^5 2≤N≤105
  • 0 ≤ M ≤ 1 0 5 0\le M\le 10^5 0≤M≤105
  • 0 ≤ K ≤ 1 0 5 0\le K\le 10^5 0≤K≤105
  • 1 ≤ A i , B i ≤ N 1\le A_i,B_i\le N 1≤Ai​,Bi​≤N
  • A i ≠ B i A_i\ne B_i Ai​=Bi​
  • 1 ≤ C i , D i ≤ N 1\le C_i,D_i\le N 1≤Ci​,Di​≤N
  • C i ≠ D i C_i\ne D_i Ci​=Di​
  • ( A i , B i ) ≠ ( A j , B j )      ( i ≠ j ) (A_i,B_i)\ne (A_j,B_j)~~~~(i≠j) (Ai​,Bi​)=(Aj​,Bj​)    (i=j)
  • ( A i , B i ) ≠ ( B j , A j ) (A_i,B_i)\ne (B_j,A_j) (Ai​,Bi​)=(Bj​,Aj​)
  • ( C i , D i ) ≠ ( D j , C j )      ( i ≠ j ) (C_i,D_i)\ne (D_j,C_j)~~~~(i≠j) (Ci​,Di​)=(Dj​,Cj​)    (i=j)
  • ( A i , B i ) ≠ ( C j , D j ) (A_i,B_i)\ne (C_j,D_j) (Ai​,Bi​)=(Cj​,Dj​)
  • ( A i , B i ) ≠ ( D j , C j ) (A_i,B_i)\ne (D_j,C_j) (Ai​,Bi​)=(Dj​,Cj​)

Input

Input is given from Standard Input in the following format:
N   M   K N~M~K N M K
A 1   B 1 A_1~B_1 A1​ B1​
A 2   B 2 A_2~B_2 A2​ B2​
: : :
A M   B M A_M~B_M AM​ BM​
C 1   D 1 C_1~D_1 C1​ D1​
C 2   D 2 C_2~D_2 C2​ D2​
: : :
C K   D K C_K~D_K CK​ DK​

Output

Print the answers in order, with space in between.

Sample Input 1

4 4 1
2 1
1 3
3 2
3 4
4 1

Sample Output 1

0 1 0 1

There is a friendship between User 2 2 2 and 3 3 3, and between 3 3 3 and 4 4 4. Also, there is no friendship or blockship between User 2 2 2 and 4 4 4. Thus, User 4 4 4 is a friend candidate for User 2 2 2.

However, neither User 1 1 1 or 3 3 3 is a friend candidate for User 2 2 2, so User 2 2 2 has one friend candidate.

Sample Input 2

5 10 0
1 2
1 3
1 4
1 5
3 2
2 4
2 5
4 3
5 3
4 5

Sample Output 2

0 0 0 0 0

Everyone is a friend of everyone else and has no friend candidate.

Sample Input 3

10 9 3
10 1
6 7
8 2
2 5
8 4
7 3
10 9
6 4
5 8
2 6
7 5
3 1

Sample Output 3

1 3 5 4 3 3 3 3 1 0

思路

把整个朋友圈拆分为一个个连通子图,再对于每个用户用对应子图节点数-1(本身)-子图中的跟当前用户有friendship和blockship的逐个得到结果

代码

代码也在这里
注意:只能使用C++>=11的编译器才能通过编译。(我提交时用的是 C++14 (GCC 5.4.1) 编译器)

#include <cstdio>
#include <vector>
#include <queue>
#define maxn 100005
using namespace std;

typedef vector<int>* Graph;

int n, m, k, graphnum[maxn], subgraphsize[maxn];
vector<int> friends[maxn], block[maxn];

template <typename T>
void bfs(const Graph& G, int v, T visit, bool* visited)
{
	queue<int> q;
	q.push(v);
	while(!q.empty())
	{
		int x = q.front(); q.pop();
		if(visited[x]) continue;
		visited[x] = true;
		visit(x);
		for(int it: G[x]) q.push(it);
	}
}

void splitgraph(const Graph& G) // Returns: number of subgraphs
{
	int cnt = 0;
	auto vis = [&cnt](int v) {
		subgraphsize[graphnum[v] = cnt] ++;
	};
	bool* visited = new bool[n];
	// split into subgraphs
	for(int i=0; i<n; i++) visited[i] = false;
	for(int i=0; i<n; i++)
		if(!visited[i])
		{
			bfs(G, i, vis, visited);
			cnt ++;
		}
	delete[] visited;
}

int main(int argc, char** argv)
{
	// Input
	scanf("%d%d%d", &n, &m, &k);
	for(int i=0; i<m; i++)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		friends[--x].push_back(--y);
		friends[y].push_back(x);
	}
	for(int i=0; i<k; i++)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		block[--x].push_back(--y);
		block[y].push_back(x);
	}
	// Split firends into subgraphs
	splitgraph(friends);
	// Count bad (friendships & blockships in current subgraph & itself) for each vertex
	int* badcnt = new int[n];
	for(int i=0; i<n; i++) badcnt[i] = 1; // 1, not 0! (the vertex itself)
	for(int i=0; i<n; i++)
	{
		// Blockship 
		for(int it: block[i])
			if(it > i && graphnum[it] == graphnum[i])
				badcnt[i] ++, badcnt[it] ++;
		// Friendship
		for(int it: friends[i])
			if(it > i && graphnum[it] == graphnum[i])
				badcnt[i] ++, badcnt[it] ++;
	}
	for(int i=0; i<n; i++) printf("%d ", subgraphsize[graphnum[i]] - badcnt[i]);
	putchar('\n');
	delete[] badcnt;
	return 0;
}
假期搞定!2026国社科申报AI全攻略指南:从选题到创新,7大核心要点手把手教你! 最后给大家推荐的400多所高校教师都在用的AI平台——高级学术版专业应用平台,集成了国际主流学术应用,以及ChatGPT、Claude、Gemini、Grok等Al大模型的高级版本平台,还有,可以辅助大家高效完成科研和学术写作任务,当然撰写硕博论文,课题、职称论文、国社科、国自然基金本子也是手拿把掐。你的任务是:用高度凝练的方式说明在(某一明确国家战略 / 政策方向,如:中国式现代化、共同富裕、基层治理现代化、数字中国、文化强国、国家安全等)背景下,我究竟要研究一个什么“具体而可操作的问题”。 阅读详情

相关推荐

eDP/DP接口简介

目前,在视频传输协议以及接口领域,外部接口主要是DP与HDMI两分天下,当然之前出现过很多接口-VGA, DVI等等,最新平台基本以这两个为主;笔记本内部接口就基本上使用eDP((Embedded Display Port))作为标准接口来驱动液晶屏了。那么问题来了,eDP和DP,是完全兼容的么?eDP,DP,HDMI,这三种接口的显示器,可以插在同一个接口上使用么?这篇文章,就会从硬件和一部分协议的角度分析一下这三大协议。

weixin_50518899的博客 2万+

[ABC157D] Friend Suggestions 题解

组互黑关系,可化为两个图。对于每一个互关关系连通块,原来没有互关的人可以互关,除了两人已经互黑。这样的人成为推荐用户。互黑的用户,如果两个用户在一个连通块里,即可减掉这个假的推荐用户。考虑类似并查集做法,记好每个用户属于哪个连通块,然后枚举与用户。深度优先搜索求出每个连通块的用户数量。考虑深度优先搜索加上容斥原理的方法。现在只要求在一个连通块中与用户。求每个人有几个推荐用户。互黑的用户和推荐用户。

luogu_553625的博客 136

安卓ai自动化脚本 Yyds.Auto实现 示例 纯ai图像识别自动点击脚本

纯ai识别实现自动化脚本

专注安卓前沿科技 4784

AtCoder Beginner Contest 157 D Friend Suggestions 容斥原理+并查集

AtCoder Beginner Contest 157 比赛人数7464 与codeforces比赛冲突,遗憾没有参加实时赛,之后模拟赛,打得没劲 AtCoder Beginner Contest 157 D Friend Suggestions 容斥原理+并查集 总目录详见https://blog.youkuaiyun.com/mrcrack/article/details/10445476...

mrcrack的博客 652

PHP证书图片生成

$realname = "姓名"; $schoolname = "学校"; $idcard = "身份证号"; $image = imagecreatefrompng('certification.png'); // 证书模版图片文件的路径 $red = imagecolorallocate($image,00,00,00); // 字体颜色

4036

初学者入门YOLO目标检测:从懵圈到上手,这篇文章讲透所有核心(附学习路径+避坑指南)

目标:比如训练一个“检测苹果和橘子”的模型,或者“检测人脸”的模型;任务:学会用LabelImg标注数据,制作YOLO格式的数据集,用命令行训练模型;关键:不用追求高精度,能训练出一个能检测出目标的模型就行。很多初学者卡在入门阶段,不是因为智商不够,而是因为“想太多,做太少”——总觉得要把所有原理搞懂才能动手,结果越想越怕,最后放弃。先动手,再动脑。先跑通一个案例,获得成就感;再制作自定义数据集,训练简单模型;最后再回头去理解原理,优化模型。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 691

Atcoder ABC157

C - Guess The Number 思路: 特判 模拟 #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <queue&...

11eyes 1106

【Bug已解决】codex: rate limit 429 / Too many requests / RPM exceeded — CodeX CLI 速率限制解决方案

CodeX CLI 触发 429 速率限制(RPM/TPM/并发)的解决方案,含请求间隔、自动重试、便宜模型、Tier 升级与多 Key 轮换。

博客 4892

Atcoder D - Friend Suggestions(并查集)

题意: 有nnn个人,mmm对双向的朋友关系,还有kkk对破裂的关系。 现在让你找iii的候选朋友,候选朋友是iii的朋友的朋友(间接朋友关系),并且还不是破裂关系。问每个iii有多少个候选朋友。 思路: 蠢死了。。。。 朋友的传递关系显然可以用并查集。我们进行dfsdfsdfs并进行合并。那么对于任意点iii来说,它所在并查集的连通块中都是它可以通过它的朋友可以到达的,但是这其中也有和它直接是朋...

一身清贫怎敢入繁华 664

信奥赛C++提高组csp-s之数论基础专题课:从同余到分数模运算1(知识地图:同余、裴蜀定理、扩展欧几里得、乘法逆元、分数模运算)

信奥赛C++提高组csp-s之数论基础专题课:从同余到分数模运算1(知识地图:同余、裴蜀定理、扩展欧几里得、乘法逆元、分数模运算)

王老师青少年编程 791

沁恒CH32V30X学习笔记02--GPIO的使用教程及2次封装驱动

刚复位后,GPIO 口运行在初始状态,这时大多数 IO 口都是运行在状态所有的 GPIO 口都可以被配置外部中断输入通道,但一个外部中断输入通道最多只能映射到一个GPIO 引脚上,且外部中断通道的序号必须和 GPIO 端口的位号一致,,两方都是一对一的关系。复用功能。

Car12 707

每日一刷atcoder开脑 abc157

abc157 简单数据结构 计算几何

qq_41739081的博客 402

【FPGA教程案例49】控制案例1——基于FPGA的PID控制器verilog实现

PID控制器产生于1915年,PID控制律的概念最早是由LYAPIMOV提出的,到目前为止,PID控制器以及改进的PID控制器在工业控制领域里最为常见。PID控制器(比例-积分-微分控制器),由比例单元 P、积分单元 I 和微分单元 D 组成。通过Kp,Ki和Kd三个参数的设定。PID控制器主要适用于基本线性和动态特性不随时间变化的系统。图1为PID控制器的基本结构框图。PID控制器以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。...

FPGA/MATLAB学习教程/源码/项目合作开发 4531

AtCoder Beginner Contest 157 D.Friend Suggestions

AtCoder Beginner Contest 157 D.Friend Suggestions 题目链接 Problem Statement (略) Constraints (略) Input Sample Input 1 4 4 1 2 1 1 3 3 2 3 4 4 1 Sample Output 1 0 1 0 1 Sample Input 2 5 10 0 1 2 1 3 1 4 ...

旺崽的博客 3045

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【AtCoder】D - Collision bfs+预处理

D 参考 权值都是1,典型bfs; 每次都bfs会T,可以bfs点1到每个点的距离(预处理)。 若想知道3到5是在Road还是Town,只需知道1-3和3-5的距离之和。 偶数是Town,奇数是Road; #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; #define pb push

karshey的博客 332

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

AtCoder D - Multiply and Rotate

题目地址:D - Multiply and Rotate 题意如上图所示: 思路 + 代码 我们采用bfsbfsbfs搜索的方法,同时我们可以保证第一次到达目的数字时的步数就是答案所需的最小操作次数,因为bfsbfsbfs是一层一层进行搜索的。 但是我们需要注意这道题中的一些细节问题: 对于题目当中的第二个操作,我们在移位变换的过程中要避免循环到同一个数字,所以我们可以定义一个数组来标记该数字。 对于每个操作,我们需要判断操作以后的数字是否有意义。当操作后的数作为字符串时的长度小于等于NNN作为字符.

萌新的博客 793

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

AtCoder Beginner Contest 339 D - Synchronized Players(BFS从0基础到1基础)

我们用一个结构体存下两个点的坐标以及当前已经走的步数,用一个四维数组存下走过的状态 值得注意的是加入碰到超出边界或者走到路障的情况不能直接跳过,而是让他维持原状态(也就是站在原地不动),因为可能另一个点会发生变化。 由于步数是单调递增的,先重合的答案一定是最优的,所以首次重合的直接输出答案即可 如果遍历完所有状态还未重合就输出-1即可

DinnerBest的博客 822

AtCoder Beginner Contest 244 F 多源BFS 状态压缩 位运算 动态规划

题目 给你N个点M条无向边的图,每个路径可以被定义为一个序列,A Ai,表示路径经过这个点的奇偶性只有1 (奇)0(偶) ,特别的经过0次时属于偶。 要求 求出序列A的每种情况(即一共2的N次方种情况)的最短路径大小的总和。 N <= 17 题解思路 因为数据范围小,考虑状态压缩,当这个状态的点经过一条边变成另一种状态的时候,就是将两种状态进行异或处理。 这样我们只将所有起点状态放入队列中跑bfs,即多源bfs,就能处理除其他状态的最短路径大小。 每个状态又必须又对应的边来转移,所以我们的dis数组需

从你的全世界路过 1070

【AtCoder】D - Number of Shortest paths BFS

D 参考 想要不T,就要减少重复加进队列的元素。 也就是说,如果一个元素在同一层的遍历里加进去过队列,我们就不必再把它加进去(否则T三个点),只需要更新它的ans值即可。 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; #define pb push_back #define fi

karshey的博客 275

ABC161 D - Lunlun Number 题解

ABC161 D - Lunlun Number 题解

天生我材必有用,千金散尽还复来。 7876

Atcode搜索

因为是bfs,所以简单的证明可以知道,如果一条路径到达一个已经到达过的点,且血量还小于等于visit时,那么即使完成了任务,其步数也不会时最优的。反之,如果到达一个点,其血量值可以更大,那么这就一种可能的路径,并不是重复到达。第一个问题就交由bfs来解决。因为之后我们要使得到达这个点的能量最大才可以走这个点,如果设置为0,假如到达终点的时候能量恰好为0,那么我们在终点的上一个点能量为1,就无法向终点走了,因为终点的0并不大于visted数组,所以visited设置为-1.

m0_73862548的博客 676

AtCoder ABC188

本期题比上期更简单,只有一个绿题,而且并不是很难的数学题,估计比赛时能AK。

acrux1985的专栏 481

AtCoder Beginner Contest 297——A-E题讲解

蒟蒻来讲题,还望大家喜。若哪有问题,大家尽可提!Hello, 大家好哇!本讲解一下这场比赛的!今晚比前面几场要简单点,但我在B题翻了下车,第一次提交竟然WA了,做题要仔细啊。开心的是,今晚终于进到绿名了!

Edward Shi的博客 3212

[AtCoder](3621)Small Multiple ---- 思维+BFS

Problem Statement Find the smallest possible sum of the digits in the decimal notation of a positive multiple of K. Constraints 2≤K≤105 K is an integer. Input Input is given from Standard Input i...

WangMeow --- ᶘ ᵒᴥᵒᶅ ฅ^•ﻌ•^ฅ 403

ABC 157 E(线段树模板)

题意/题解: 给定一个字符串,1.1.1.修改某个字符串中的某个字符,2.2.2.查询字符串某个区间中不同字符的个数。26棵线段树套板子即可。 又是一道直接区修问题,还不太熟悉这类的具体修改,其实还可以加个lazylazylazy标记,不过查询并不多直接做就好了,由于每次修改只涉及两个字符所以只需要修这两棵线段树即可。 #include<bits/stdc++.h> using na...

solego’s blog 665

AtCoder Beginner Contest 184 E (bfs)

题意: 一个n*m的地图,每个格子的图案为S , G , . ,#,a~z。 从S走到G,每次只能从4个方向走或者相同字母任意传送,求最小步数 题解: 先存下来每个字母的位置。然后bfs时当前字符为a~z时,看是否是第一次走过,如果是的话就对所有为相同字符的字母进行入队,然后标记当前字母已经遍历过,否则直接跳过该操作。其他的操作就和普通的bfs一样,向4个方向遍历,具体操作看代码。 #include<bits/stdc++.h> using namespace std; typedef long

weixin_43899268的博客 406
上一篇: Python函数之*[参数名]和**[参数名]的用处
下一篇: C++ 报错 ‘__gcd‘ was not declared in this scope 解决
GoodCoder666
博客等级 码龄7年 2320粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值