首页 > 其他分享 >【大联盟】20230706 graph(graph) QOJ4635 【Graph Operation】

【大联盟】20230706 graph(graph) QOJ4635 【Graph Operation】

时间:2023-07-22 17:34:06浏览次数:40  
标签:度数 20230706 QOJ4635 int graph read tj tk

题解

赛时得分:60/? 写了个乱搞

首先考虑无解的条件。注意到一次操作后,所有点的度数都没有改变,所以无解的充分条件就是存在一个点的度数在两张图中不相等。接下来尝试构造策略,使得度数相等的时候都能出解。

我们可以将题意转化一下,变为对图 \(G\) 和图 \(H\) 都可以操作,使得最后产生的两张图相等。输出答案时,只需先输出在 \(G\) 上的操作,再倒序输出在图 \(H\) 上的操作的逆操作即可。

考虑类似增量构造,我们按编号从小到大扫点。扫到点 \(i\) 时,我们找出所有在 \(G\) 中有、在 \(H\) 中没有的边以及所有在 \(H\) 中有、在 \(G\) 中没有的边。由于两张图 \(i\) 号点的度数相同,所以我们对这些边两两配对。

假设要删边的点在 \(G\) 中有、在 \(H\) 中没有的边为 \((i,a)\),在 \(H\) 中有、在 \(G\) 中没有的边为 \((i,b)\)。有两种方案:

  1. 在 \(G\) 中删除 \((i,a)\),同时添加 \((i,b)\),这就需要在 \(G\) 中找到一个点 \(t\) 满足 \(a\nsim t,b\sim t\),然后在 \(G\) 操作 \((i,a,b,t)\);
  2. 在 \(H\) 中添加 \((i,a)\),同时删除 \((i,b)\),这就需要在 \(H\) 中找到一个点 \(t\) 满足 \(a\sim t,b\nsim t\),然后在 \(H\) 操作 \((i,b,a,t)\)。

那么,现在我们得说明两种方案一定有一种可行。设 \(N_G(x)\) 表示点 \(x\) 在图 \(G\) 中邻居的集合,\(N_H(x)\) 同理。

若方案 1 不可行,说明 \(N_G(b)\subseteq N_G(a)\),又因为 \(G\) 中有 \((i,a)\),\(G\) 中没有 \((i,b)\),所以 \(N_G(w)\subsetneq N_G(v)\),所以 \(|N_G(a)| > |N_G(b)|\)。同理可得,若方案 2 也不可行,\(|N_H(b)| > |N_H(a)|\),又因为度数相同 \(|N_G(a)|=|N_H(a)|,|N_G(b)|=|N_H(b)|\),所以矛盾。

考虑用 bitset 优化找点过程。

时间复杂度 \(O(\frac{n^3}{\omega})\)。

代码

#include <bits/stdc++.h>
#define SZ(x) (int) x.size() - 1
#define all(x) x.begin(), x.end()
#define ms(x, y) memset(x, y, sizeof x)
#define F(i, x, y) for (int i = (x); i <= (y); i++)
#define DF(i, x, y) for (int i = (x); i >= (y); i--)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template <typename T> void chkmax(T& x, T y) { x = max(x, y); }
template <typename T> void chkmin(T& x, T y) { x = min(x, y); }
template <typename T> void read(T &x) {
	x = 0; int f = 1; char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
	for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	x *= f;
}
const int N = 1010;
bitset <N> g[N], h[N];
int n, m, dg[N], dh[N];
vector <pair <pair <int, int>, pair <int, int>>> ansg, ansh;
signed main() {
	freopen("graph.in", "r", stdin);
	freopen("graph.out", "w", stdout);
	read(n), read(m);
	F(i, 1, m) {
		int x, y; read(x), read(y);
		dg[x]++, dg[y]++;
		g[x][y] = g[y][x] = true;
	}
	F(i, 1, m) {
		int x, y; read(x), read(y);
		dh[x]++, dh[y]++;
		h[x][y] = h[y][x] = true;
	}
	F(i, 1, n)
		if (dg[i] != dh[i]) {
			puts("-1");
			return 0;
		}
	F(i, 1, n) {
		vector <int> tj, tk;
		F(j, i + 1, n) {
			if (g[i][j] && !h[i][j]) tj.push_back(j);
			if (!g[i][j] && h[i][j]) tk.push_back(j);
		}
		F(j, 0, SZ(tj)) {
			bitset <N> t = (~g[tj[j]]) & g[tk[j]];
			t[i] = t[tj[j]] = t[tk[j]] = false;
			int pos = t._Find_first();
			if (pos <= n) {
				ansg.emplace_back(make_pair(i, tj[j]), make_pair(tk[j], pos));
				g[i][tj[j]] = g[tj[j]][i] = g[tk[j]][pos] = g[pos][tk[j]] = false;
				g[i][tk[j]] = g[tk[j]][i] = g[tj[j]][pos] = g[pos][tj[j]] = true;
				continue;
			}
			t = h[tj[j]] & (~h[tk[j]]);
			t[i] = t[tj[j]] = t[tk[j]] = false;
			pos = t._Find_first();
			if (pos <= n) {
				ansh.emplace_back(make_pair(i, tj[j]), make_pair(tk[j], pos));
				h[i][tk[j]] = h[tk[j]][i] = h[tj[j]][pos] = h[pos][tj[j]] = false;
				h[i][tj[j]] = h[tj[j]][i] = h[tk[j]][pos] = h[pos][tk[j]] = true;
				continue;
			} assert(false);
		}
		F(j, 1, n) {
			h[i][j] = h[j][i] = g[i][j] = g[j][i] = false;
		}
	}
	cout << ansg.size() + ansh.size() << endl;
	for (auto i: ansg) cout << i.first.first << " " << i.first.second << " " << i.second.first << " " << i.second.second << endl;
	reverse(all(ansh));
	for (auto i: ansh) cout << i.first.first << " " << i.first.second << " " << i.second.first << " " << i.second.second << endl;
	return 0;
}

标签:度数,20230706,QOJ4635,int,graph,read,tj,tk
From: https://www.cnblogs.com/zhaohaikun/p/17573773.html

相关文章

  • 云原生基础设施实践:NebulaGraph 的 KubeBlocks 集成故事
    像是NebulaGraph这类基础设施上云,通用的方法一般是将线下物理机替换成云端的虚拟资源,依托各大云服务厂商实现“服务上云”。但还有一种选择,就是依托云数据基础设施,将数据库产品变成为云生态的一环,不只是提供自身的数据云服务,还能同其他的数据库一起分析挖掘业务数据价值。在本......
  • Unified Conversational Recommendation Policy Learning via Graph-based Reinforcem
    图的作用:图结构捕捉不同类型节点(即用户、项目和属性)之间丰富的关联信息,使我们能够发现协作用户对属性和项目的偏好。因此,我们可以利用图结构将推荐和对话组件有机地整合在一起,其中对话会话可以被视为在图中维护的节点序列,以动态地利用对话历史来预测下一轮的行动。由四个主要组......
  • vscode GraphQL插件踩坑
    TLDRvscode的GraphQL语法插件,目前比较推荐GraphqlFoundation的GraphQL:LanguageFeatureSupport相关配置,见[GraphQL:LanguageFeatureSupport](#GraphQL:LanguageFeatureSupport)配置文件的语法规则,参考GraphQLConfig背景之前用的GraphQL插件,只开......
  • Query2box Reasoning over Knowledge Graphs in Vector Space using Box Embeddings
    目录概符号说明Query2Box代码RenH.,HuW.andLeskovecJ.Query2box:Reasoningoverknowledgegraphsinvectorspaceusingboxembeddings.ICLR,2020.概Boxembedding用于查询判断,和我想的那个有很大差别啊.我对这方面不是很了解,只能记录个大概.符号说明......
  • 手把手教你用 NebulaGraph AI 全家桶跑图算法
    前段时间NebulaGraph3.5.0发布,@whitewum吴老师建议我把前段时间NebulaGraph社区里开启的新项目ng_ai公开给大家。所以,就有了这个系列文章,本文是该系列的开篇之作。ng_ai是什么ng_ai的全名是:NebulagraphAISuite,顾名思义,它是在NebulaGraph之上跑算法的Python套......
  • [VLDBJ 2022]Privacy and efficiency guaranteed social subgraph matching
    Privacyandefficiencyguaranteedsocialsubgraphmatching动机目标是在不影响查询处理的同时保护隐私其中的子图匹配算法PGP查询会先被分解为星形结构(11行),拿这些分解得到的子图去做匹配实验数据集三个N分别表示类型、属性和标签数量。待补充......
  • POJ 2109 Power of Cryptography 数学题 double和float精度和范围
    PowerofCryptographyTimeLimit:1000MSMemoryLimit:30000KTotalSubmissions:21354Accepted:10799DescriptionCurrentworkincryptographyinvolves(amongotherthings)largeprimenumbersandcomputingpowersofnumbersamongtheseprimes.Workint......
  • R语言代做编程辅导ASSIGNMENT FOUR - RANDOM GRAPHS(附答案)
    全文链接:https://tecdat.cn/?p=33183PROBLEM1)CreatingRandomAdjacencyMatricesScriptName:adjMatrixInput:n...Thenumberofverticesinthegraphp...Probablitytwoverticesareconnectedplot...whetherornotthematrixshouldbeplottedasagraph......
  • 如何开发 RESTful、GraphQL 和 SOAP 等不同类型的 API ?
    在软件开发中,API(应用程序编程接口)的重要性不言而喻。API已成为不可或缺的构建模块,使开发人员能够创建功能丰富、多样化和可扩展的应用程序。这是一篇综合指南,旨在深入探讨API开发,使初学者和有经验的开发人员都能充分挖掘API在项目中的潜力。本指南将详尽探讨API开发的基本要素,包......
  • React18+TS+NestJS+GraphQL 全栈开发在线教育平台
    第1章这里,将带你进行一次全面,高效的进阶试看3节‖36分钟学习本课程你能得到什么?不论是技术提升,职场晋升,面试跳槽,你都会有所收获。第2章了解用户需求,懂得如何做项目试看4节‖54分钟本章让大家了解一个企业级项目的用户需求是什么,有哪几种角色,是如何使用我们的产品的,知道......