首页 > 其他分享 >【贪心】P7403 [BalticOI 2002 Day1] Tennis Club

【贪心】P7403 [BalticOI 2002 Day1] Tennis Club

时间:2024-02-13 19:13:44浏览次数:31  
标签:度数 dots Club 定理 Tennis 图化 P7403 简单 序列

目前题解区还没有证明,我交个证明。

形式化题意

给定每个点的度数 \(d_i\),请构造一个简单无向图(无重边无自环)。

First. 无解

首先,根据握手定理,每个无向图的度数之和为边数的两倍,所以如果度数之和为奇数,那么肯定无解。

但是发现,这种情况之外还有别的无解情况(本题有 \(3\) 个无解数据,只能 AC 一个)。

而这种情况,就需要给出一个保证正确的构造方案,如果无法构造那么无解。

Second. 构造

这里介绍一个定理:

Havel-Hakimi定理

一个不降序度数序列 \(d = \{d_1,d_2,\dots, d_n\}\) 若其可以简单图化,当且仅当 \(d' = \{ d_2 - 1, d_3 - 1, \dots,d_{d_1 + 1} - 1,d_{d_1+2},\dots,d_n \}\) 可以简单图化。

  1. 证明:\(d\) 若其可以简单图化,那么 \(d'\) 可以简单图化。

    两种情况:

    1. 图 \(G\) 中存在边 \(\{ (1, 2),(1,3),\dots,(1,d_1 + 1)\}\),显然,此时删去这些边该图仍然为简单图且满足度数序列 \(d'\),所以 \(d'\) 可简单图化。
    2. 图 \(G\) 中存在点对 \((i, j)\) 满足 \(d_i \ge d_j\) 且仅存在边 \((1,j)\) 而不存在边 \((1,i)\) 且 \(i \le d_1 + 1,j > d_1 + 1\),那么此时由于 \(d_i \ge d_j\) 那么一定存在一个点 \(u\) 满足存在 \((i, u)\) 但不存在 \((j, u)\),将 \((i, u)\) 修改为 \((1, u)\),\((1, j)\) 修改为 \((j, u)\),该图度数序列不变且仍然为简单图,此时,情况又变为情况 \(1\)。
  2. 证明:\(d'\) 可以简单图化,那么 \(d\) 可以简单图化。
    构造很简单,\(1\) 与 \(2, 3,\dots, d_1 + 1\) 连边,该图仍为简单图,且度数序列变为 \(d\)。

显然,度数序列 \(d = \{0, 0, \dots, 0\}\) 一定可以简单图化,那么只需要重复运用定理,直至度数序列化为 \(d = \{ 0,0 , \dots, 0\}\) 即可。

如果不能进行如上操作(即 \(d_i - 1 < 0 (2 \le i \le d_1 + 1)\)),那么无解。

注意,定理中的 \(d\) 是不降序度数序列,那么每次操作后需要排序才能再次进行操作。

Code

#include <bits/stdc++.h>
using namespace std;

const int N = 1e3 + 10;
int n;
pair<int, int> g[N];
vector<int> ans[N];

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n;
	int d = 0;
	for (int i = 1; i <= n; i ++) {
		cin >> g[i].first;
		g[i].second = i, d += g[i].first;
	}
	if (d & 1) { // 握手定理
		cout << "NO SOLUTION\n";
		return 0;
	}
	for (int t = 1; t <= n; t ++) {
		sort(g + 1, g + 1 + n); // 排序
		int j = n - 1;
		while (g[n].first) { // 从次大值开始减
			g[j].first --, g[n].first --;
			if(g[j].first < 0) { //无法加边,无解
				cout << "NO SOLUTION\n";
				return 0;
			}
			ans[g[j].second].push_back(g[n].second);
			ans[g[n].second].push_back(g[j].second);
			j --;
		}
	}
	cout << "SOLUTION\n";
	for (int i = 1; i <= n; i ++) {
		for (auto u : ans[i]) cout << u <<  ' ';
		cout << endl;
	}
	return 0;
}

标签:度数,dots,Club,定理,Tennis,图化,P7403,简单,序列
From: https://www.cnblogs.com/Ice-lift/p/18014721

相关文章

  • Codeforces 1876G Clubstep.md
    首先考虑暴力的贪心。从\(r\)到\(l\)依次遍历,若\(a_i<x\)则一直进行题目中的操作。正确性是能保证的,因为选后面的\(j\)只能\(+1\),而选\(i\)可以\(+2\),且\(i\)前面的部分都是\(+1\)。考虑转化一下,把对\(i\)进行操作\(k\)次后,\(\forallj\in[1,i),a_j\l......
  • [CF283E] Cow Tennis Tournamsan
    CF283E答案即为\(\binom{n}{3}\)减去不合法环数。一个三元环中最多1个点出度为2,所以出度为x的点会造成\(\binom{x}{2}\)个不合法的环。\(\Omicron(nm)\)的做法就是枚举i,判断i与n个点连边是否反向(0,1表示)。然后可以发现对于一段区间[l,r]修改后做贡献的点是......
  • ForexClub七夕交易大赛启动! 点燃交易之火为爱而战!
    在这个充满激情的七夕季,ForexClub与您携手,掀起交易狂潮!点燃您心中的交易热忱,冲锋市场,赢取惊人奖金!别等了,参赛即有机会获得77美元的交易赠金,让我们一同为迸发的交易机会,燃烧一片天!【大方赠礼,乐享不停】最高返还40%交易手续费,更有77美元交易赠金助兴!1.零难度参赛,心动登场!无需复......
  • 2023年多校联训NOIP层测试3+「SFCOI-3」Sadness Fan Club Round 3
    2023年多校联训NOIP层测试3T1数列变换\(10pts\)考虑暴力,发现\(f\)数列进行一次变换\(A\),再进行一次变换\(B\)后,恢复成了原数列;\(f\)数列进行一次变换\(B\),再进行一次变换\(A\)后,也恢复成了原数列。即变换\(A\)可以和变换\(B\)相互抵消。本质是差分是前缀......
  • 明白均线信号Forexclub的投资者就知道如何交易
    在Forexclub上的交易的投资者,都在使用5、25和50周期的均线来分析收盘价。其中,5周期的均线为红色,25和50周期的均线为黄色。同时使用抛物面SAR指标,保留其默认参数。开立多头头寸的条件是:5周期的红色均线从下方突破25和50周期的黄色均线,同时抛物面SAR指标在烛台下面。开设短期交易的条......
  • 动量定理Forexclub总结的交易规则
    动量定理策略是一种趋势策略,基于周线图中的“三烛台”形态(上涨或下跌)进行交易。Forexclub总结的交易规则如下:1. 下一个烛台必须比上一个烛台大,以确认趋势存在。2. 多奇烛台(不带主体的烛台)不考虑在内。3. 止损设置在序列中第一根蜡烛线的收盘水平。4. 止盈是最后一个烛台的5......
  • 动量定理不愧是大师都在推荐使用的交易策略Forexclub总结两点
    动量定理对交易策略的重要性不言而喻,许多交易大师都在推荐使用。Forexclub认为它可以通过观察趋势的持续时间来预测价格走势,使用振荡器来确定趋势支点,这个振荡器比标准振荡器更快,能够提前给出买卖信号。该振荡器由两条线组成,信号线是虚线,附加线是实线。接收线有两种颜色,橙色和绿色......
  • 移动平均线Forexclub这样用,一眼识别买卖信号
    Forexclub建议使用H1时间框架和欧元/美元货币对。在该策略中,Forexclub使用了线性加权移动平均线作为主要指标,同时将其作为一个额外的过滤器。线性加权移动平均线(LWMA)的优势在于,它更重视最近的价格变动,而且长期时间框架几乎没有延迟。此外,Forexclub仅根据MA相对于价格变动的位置来......
  • 在Forexclub平台能得到什么
    在Forexclub平台交易中,发现了了一套实用的建议,帮助投资者实现挂单交易的成功。这个策略以回溯测试和真实账户表现为基础,旨在为特定资产或当前市场情况提供单个参数的指标。每个策略都包含带有指示器的模板和安装的详细说明,以便在真实交易环境中成功应用这些模板,从而实现对外汇市场......
  • 对冲策略Forexclub 实操进行石油交易
    在前面的文章中有交易者反馈Forexclub,不知道怎么使用对冲策略,今天Forexclub就根据当天的新闻消息实例运用对冲策略进行石油交易。没有依靠EIA的数据,而是根据当天举行的一次非常重要的欧佩克+会议的结果进行交易。在宣布结果之前,Forexclub设置了两个不同方向的订单,等待其中一个触发......