[题解] Codeforces 1268 D Invertation in Tournament 结论,兰道定理
本题需要用到的结论:
一.兰道定理
二.如果\(n\geq4\),那么\(n\)个点的强连通竞赛图存在\(n-1\)个点的强连通子图。
证明:
现在有一个n-1个点的竞赛图(不一定强连通,称其为原图),加入n号点,得到的n个点的竞赛图是强连通的。将原图强连通分量分解,按照拓扑序排好,称为\(a_0 \cdots a_k\)(一共k个强连通分量)。现在考虑证明加入n号点后的图,删掉某一个点后一定可以得到强连通图。
k=1:去掉n号点即可。
\(k \geq 3\):原图是长成这样的(不太准确,看个大概就行):

也就是每两个分量之间都有从前到后的边。现在加入n号点,形成强连通图,既然强连通,那么\(a_k\)到n肯定有边,n到\(a_0\)也肯定有边。可以在任意一个\(a_i(0<i<k)\)中任选一个点删掉,这时任意两个点u和v(\(u,v \neq n\))仍然可以通过\(u \to a_k \to n \to a_0 \to v\)的方式到达。n号点和其他点之间显然可以任意到达。k=2 因为\(n \geq 4\),所以两个分量里一定有至少一个有>1个元素,我们选择元素>1个的分量,从里面删一个点。以删\(a_1\)中的点为例,在\(a_1\)中随便挑一个到n有边的点r,因为\(a_1\)强连通,所以能够在\(a_1\)中选出一个以r为根的"反向"生成树:

在这个生成树里任意选一个叶子删掉,可以发现不影响任意两个节点之间的可达性。删除\(a_0\)中的点也是一样证明的,只是生成树变成了正向的。到这里2号结论就证完了。
三. \(n \geq 4\)时,n个点的强连通竞赛图可以翻转一个点,使得操作后的图仍然强连通。
根据结论二,可以先找出n-1个点的强连通子图,把剩下的1个点翻转即可。
四. \(n \geq 7\)时可以翻转至多1个点使图强连通。
证明:
还是像上面的证明一样把scc的拓扑序列出来
- k=1 不需翻转直接合法
- \(k \geq 3\),任选一个i满足\(0<i<k\),翻转\(a_i\)中的一个点x,发现任意u,v(\(u,v \neq x\))都有路径\(u \to a_k \to x \to a_0 \to v\);x和其他节点之间显然也是可以互相到达的。
- k=2 \(a_0和a_1\)必有一个分量大小\(\geq 4\),假设\(a_1\)大小\(\geq 4\),根据结论三,在里面可以翻转一个点,使得\(a_1\)仍然强连通,且整个图产生环,变为强连通图。
有了这些结论这题就基本做完了,\(n\leq 6\)的暴力枚举翻转的点集,其余情况枚举翻转哪一个节点或者是不翻转,检查的时候直接用兰道定理就可以了。
时间复杂度\(O(n^2log_2n)\)。
点击查看代码
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define pb push_back
#define fi first
#define se second
#define mpr make_pair
using namespace std;
int n,D[2010];
string s[2010];
char c[2010];
bool check(vector <int> v)
{
sort(v.begin(),v.end());
int sum=0;
rep(i,v.size()-1)
{
sum+=v[i];
if(sum==i*(i+1)/2) return false;
}
return true;
}
bool isGood(int msk)
{
int d[10],sw[10];
rep(i,10) d[i]=0;
rep(i,n) sw[i]=((msk&(1<<i))>0 ? 1:0);
rep(i,n) rep(j,i)
{
int dir=(s[i][j]-'0')^sw[i]^sw[j];
if(dir==1) ++d[j];
else ++d[i];
}
vector <int> v;rep(i,n) v.pb(d[i]);
return check(v);
}
bool isGood2(int id)
{
int d[2010];
rep(i,n) d[i]=D[i];
if(id>-1)
{
rep(i,n) if(i!=id)
{
int dir=(s[id][i]-'0')^1;
if(dir==1) ++d[i],--d[id];
else --d[i],++d[id];
}
}
vector <int> v;rep(i,n) v.pb(d[i]);
return check(v);
}
int main()
{
freopen("rv.in","r",stdin);
freopen("rv.out","w",stdout);
cin>>n;
rep(i,n)
{
scanf("%s",c);
s[i]=c;
}
if(n<=6)
{
pii ans=mpr(1e9,0);
rep(i,1<<n) if(isGood(i))
{
int res=__builtin_popcount(i),vv=1;
repn(j,res) vv*=j;
if(res<ans.fi) ans=mpr(res,vv);
else if(res==ans.fi) ans.se+=vv;
}
if(ans.se==0) puts("-1");
else cout<<ans.fi<<' '<<ans.se<<endl;
}
else
{
rep(i,n) rep(j,i)
{
int dir=(s[i][j]-'0');
if(dir==1) ++D[j];
else ++D[i];
}
if(isGood2(-1)) puts("0 1");
else
{
int ans=0;
rep(i,n) if(isGood2(i)) ++ans;
cout<<1<<' '<<ans<<endl;
}
}
return 0;
}
[题解] Codeforces 1268 D Invertation in Tournament 结论,兰道定理的更多相关文章
- [题解] Codeforces 1720 E Misha and Paintings 结论
题目 算是诈骗题? 令一开始就存在的颜色数为cnt.k>=cnt的情况,显然每次找一个出现不止一次的颜色,然后把这个颜色的恰好一个方块替换成一种没有出现过的颜色就可以了,\(k-cnt\)次解决 ...
- Educational Codeforces Round 8 A. Tennis Tournament 暴力
A. Tennis Tournament 题目连接: http://www.codeforces.com/contest/628/problem/A Description A tennis tour ...
- Codeforces 577B Modulo Sum:数学 结论【选数之和为m的倍数】
题目链接:http://codeforces.com/problemset/problem/448/C 题意: 给你n个数字,给定m. 问你是否能从中选出若干个数字,使得这些数字之和为m的倍数. 题解 ...
- [题解][Codeforces]Good Bye 2019 简要题解
构造题好评,虽然这把崩了 原题解 A 题意 二人游戏,一个人有 \(k_1\) 张牌,另一个人 \(k_2\) 张,满足 \(2\le k_1+k_2=n\le 100\),每张牌上有一个数,保证所有 ...
- [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP
题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...
- [题解] Codeforces Round #549 (Div. 2) B. Nirvana
Codeforces Round #549 (Div. 2) B. Nirvana [题目描述] B. Nirvana time limit per test1 second memory limit ...
- 题解——CodeForces 438D The Child and Sequence
题面 D. The Child and Sequence time limit per test 4 seconds memory limit per test 256 megabytes input ...
- [题解][Codeforces]Codeforces Round #602 (Div. 1) 简要题解
orz djq_cpp lgm A 题意 给定一个分别含有 \(\frac n2\) 个左括号和右括号的括号序列 每次可以将序列的一个区间翻转 求一个不超过 \(n\) 次的操作方案,使得操作完之后的 ...
- [题解]Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round) - A. Basic Diplomacy
[题目] A. Basic Diplomacy [描述] Aleksey有n个朋友,有一个m天的假期,每天都需要一个朋友来陪他.给出每天有空的朋友的编号,要求同一个朋友来的天数不能超过m/2上取整.求 ...
随机推荐
- Python算法之动态规划(Dynamic Programming)解析:二维矩阵中的醉汉(魔改版leetcode出界的路径数)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_168 现在很多互联网企业学聪明了,知道应聘者有目的性的刷Leetcode原题,用来应付算法题面试,所以开始对这些题进行" ...
- 【JAVA UI】HarmonyOS 如何使用TinyPinyin类库
参考资料 前言:TinyPinYin是一个适用于Java和Android.HarmonyOS的快速,低内存的汉字转拼音库.码云地址TinyPinYin,其使用方法已在API讲解中有详细介绍,本文 ...
- 梳理清楚springAOP,轻松面向切面编程
不知道大家有没有这样的感觉,平时经常说aop,但是对aop中的一些概念还是模糊,总感觉很飘渺,今天来梳理下关于aop的知识. 一.概念 我们知道现在开发都是spring,讲的最多的也是springAO ...
- Mybatis框架--优化过程
0. 原代码预览 简单实现在数据库中插入数据 public void testInsert() throws IOException { //获取核心配置文件的输入流 InputStream is = ...
- 未来的可再生能源电网!FREEDM 论文阅读
全文主旨[省时间快读] 背景: 论文标题:The Future Renewable Electric Energy Delivery and Management (FREEDM) System: T ...
- [CF1526D] Kill Anton(逆序对,搜索)
题面 A N T O N \rm ANTON ANTON 的基因由 A , N , T , O \rm A,N,T,O A,N,T,O 四种碱基排列组成. A N T O N \rm ANTON AN ...
- Get请求使用请求体传递参数会报400异常的问题
问题描述: 前端使用Get请求并且使用请求体传递参数,后端使用@RequestBody注解封装参数,这时会出现400的异常信息. 解决方法: 1.Get请求不要使用请求体,使用请求体的话用POST请求 ...
- 第二十四篇:对于dom的理解
好家伙, HTML CSS JS structure style function 结构体 样式 功能 <> ...
- 阿里云Centos7部署私人CSGO服务器
大四毕业生,论文和答辩分别以1.8%的重复率和只答不辨的态度双双过关.现在就是在家等着学校发毕业证了.顺带学学驾驶...可是我这么一个喜欢折腾的人,怎么能够让自己接受这么无聊的咸鱼时光呢?因为这个寒假 ...
- 我的Vue之旅、02 ES6基础、模块、路径、IO
自定义模块 为什么要模块?模块化源代码能给我们带来什么好处? 试想一个巨无霸网购平台,在没有模块化的情况下,如果出现bug,程序员就要在几百万行代码里调试,导致后期维护成本上升,为了解决问题,模块化按 ...