Web of Lies(图论/入度)

这篇博客讨论了一个图论问题,给定节点权值和操作,计算num值,即与更大权值节点相连且度数为0的节点数。题目描述了输入输出格式,并给出了C++代码实现,通过维护num值来处理边的添加和删除操作,快速响应查询。
摘要由CSDN通过智能技术生成

题目
题意:给定n个点,第i个点的点权为i。初始时有m个边。现在有q个操作。
1 u v,表示把节点u和v连接,保证之前他们没有连接。
2 u v,表示把节点u和v拆开连接,保证它们之前已连接。
3 查询当前图的num值,num值计算方法如下:
1)遍历所以节点,如果当前节点i有和其他节点连接,且连接的节点的权值都大于它,则把该节点干掉。
2)消去节点后得到新的图,重复1)过程,直到没有节点可以消去。
3)剩余的节点数则为num值。

思路:num本质上表示图里与更大权值的节点相连的度数为0的节点数,我们只需维护该值即可。

#include<bits/stdc++.h> 
using namespace std;
const int maxn = 200010;

int n, m, q;
int in[maxn];

int main() {
	scanf("%d%d", &n, &m);
	int num = n;
	int u, v, op;
	while (m--) {
		scanf("%d%d", &u, &v);
		if (u < v) swap(u, v);
		if (in[v]++ == 0) {
			--num;
		}
	}
	scanf("%d", &q);
	while (q--) {
		scanf("%d", &op);
		if (op == 3) {
			printf("%d\n", num);
		} else {
			scanf("%d%d", &u, &v);
			if (u < v) swap(u, v);
			if (op == 1) {
				if (in[v]++ == 0) 
					--num;
			} else {
				if (--in[v] == 0)
					++num;
			}
		}

	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值