P8710 [蓝桥杯 2020 省 AB1] 网络分析

题目描述

小明正在做一个网络实验。

他设置了 nnn 台电脑,称为节点,用于收发和存储数据。

初始时,所有节点都是独立的,不存在任何连接。

小明可以通过网线将两个节点连接起来,连接后两个节点就可以互相通信了。两个节点如果存在网线连接,称为相邻。

小明有时会测试当时的网络,他会在某个节点发送一条信息,信息会发送到每个相邻的节点,之后这些节点又会转发到自己相邻的节点,直到所有直接或间接相邻的节点都收到了信息。所有发送和接收的节点都会将信息存储下来。一条信息只存储一次。

给出小明连接和测试的过程,请计算出每个节点存储信息的大小。

输入格式

输入的第一行包含两个整数 nnnmmm,分别表示节点数量和操作数量。节点从 111nnn 编号。

接下来 mmm 行,每行三个整数,表示一个操作。

如果操作为 1 a b,表示将节点 aaa 和节点 bbb 通过网线连接起来。当 a=ba=ba=b 时,表示连接了一个自环,对网络没有实质影响。

如果操作为 2 p t,表示在节点 ppp 上发送一条大小为 ttt 的信息。

输出格式

输出一行,包含 nnn 个整数,相邻整数之间用一个空格分割,依次表示进行完上述操作后节点 111 至节点 nnn 上存储信息的大小。

输入输出样例 #1

输入 #1

4 8
1 1 2
2 1 10
2 3 5
1 4 1
2 2 2
1 1 2
1 2 4
2 2 1

输出 #1

13 13 5 3

说明/提示

对于 30%30\%30% 的评测用例,1≤n≤201 ≤ n ≤ 201n201≤m≤1001 ≤ m ≤ 1001m100

对于 50%50\%50% 的评测用例,1≤n≤1001 ≤ n ≤ 1001n1001≤m≤10001 ≤ m ≤ 10001m1000

对于 70%70\%70% 的评测用例,1≤n≤10001 ≤ n ≤ 10001n10001≤m≤100001 ≤ m ≤ 100001m10000

对于所有评测用例,1≤n≤100001 ≤ n ≤ 100001n100001≤m≤1051 ≤ m ≤ 10^51m1051≤t≤1001 ≤ t ≤ 1001t100

蓝桥杯 2020 第一轮省赛 A 组 J 题(B 组 J 题)。

C++实现

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0;char c=getchar();
	while(c<48) c=getchar();
	while(c>47) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x;
}
const int N=1e4+4;
const int M=1e5+5;
int n,m,fa[N],cha[N],sum[N];
inline int FIND(int x){//并查集(路径压缩) 
	if(fa[x]==x) return x;
	int fx=FIND(fa[x]);
	cha[x]+=cha[fa[x]];
	return fa[x]=fx;
}
inline void merge(int x,int y){
	int fx=FIND(x),fy=FIND(y);
	if(fx==fy){
		return ;
	}
	if(sum[fx]<sum[fy]){//这里是保证cha[fx]非负 
		swap(fx,fy);
	}
	cha[fy]=sum[fx]-sum[fy];//这里相当于在fx、fy间建一条权值为sum[fx]-sum[fy]的边
	fa[fy]=fx;
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++){
		int op=read(),x=read(),y=read();
		if(op==1){//连通块合并 
			merge(x,y);
		}
		if(op==2){//连通块整体加t 
			int fx=FIND(x);sum[fx]+=y;
		}
	}
	for(int i=1;i<=n;i++){
		int fi=FIND(i);
		sum[i]=sum[fi]-cha[i];//输出时统计i当前权值 
		printf("%lld ",sum[i]);
	}
	return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

更多推荐