题目

本题需要用到的结论:

一.兰道定理

二.如果\(n\geq4\),那么\(n\)个点的强连通竞赛图存在\(n-1\)个点的强连通子图。

证明:

现在有一个n-1个点的竞赛图(不一定强连通,称其为原图),加入n号点,得到的n个点的竞赛图是强连通的。将原图强连通分量分解,按照拓扑序排好,称为\(a_0 \cdots a_k\)(一共k个强连通分量)。现在考虑证明加入n号点后的图,删掉某一个点后一定可以得到强连通图。

  1. k=1:去掉n号点即可。

  2. \(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号点和其他点之间显然可以任意到达。

  3. 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的拓扑序列出来

  1. k=1 不需翻转直接合法
  2. \(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和其他节点之间显然也是可以互相到达的。
  3. 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 结论,兰道定理的更多相关文章

  1. [题解] Codeforces 1720 E Misha and Paintings 结论

    题目 算是诈骗题? 令一开始就存在的颜色数为cnt.k>=cnt的情况,显然每次找一个出现不止一次的颜色,然后把这个颜色的恰好一个方块替换成一种没有出现过的颜色就可以了,\(k-cnt\)次解决 ...

  2. Educational Codeforces Round 8 A. Tennis Tournament 暴力

    A. Tennis Tournament 题目连接: http://www.codeforces.com/contest/628/problem/A Description A tennis tour ...

  3. Codeforces 577B Modulo Sum:数学 结论【选数之和为m的倍数】

    题目链接:http://codeforces.com/problemset/problem/448/C 题意: 给你n个数字,给定m. 问你是否能从中选出若干个数字,使得这些数字之和为m的倍数. 题解 ...

  4. [题解][Codeforces]Good Bye 2019 简要题解

    构造题好评,虽然这把崩了 原题解 A 题意 二人游戏,一个人有 \(k_1\) 张牌,另一个人 \(k_2\) 张,满足 \(2\le k_1+k_2=n\le 100\),每张牌上有一个数,保证所有 ...

  5. [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP

    题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...

  6. [题解] Codeforces Round #549 (Div. 2) B. Nirvana

    Codeforces Round #549 (Div. 2) B. Nirvana [题目描述] B. Nirvana time limit per test1 second memory limit ...

  7. 题解——CodeForces 438D The Child and Sequence

    题面 D. The Child and Sequence time limit per test 4 seconds memory limit per test 256 megabytes input ...

  8. [题解][Codeforces]Codeforces Round #602 (Div. 1) 简要题解

    orz djq_cpp lgm A 题意 给定一个分别含有 \(\frac n2\) 个左括号和右括号的括号序列 每次可以将序列的一个区间翻转 求一个不超过 \(n\) 次的操作方案,使得操作完之后的 ...

  9. [题解]Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round) - A. Basic Diplomacy

    [题目] A. Basic Diplomacy [描述] Aleksey有n个朋友,有一个m天的假期,每天都需要一个朋友来陪他.给出每天有空的朋友的编号,要求同一个朋友来的天数不能超过m/2上取整.求 ...

随机推荐

  1. Minimax 社论

    目录 题面 题解 代码 Reference 题面 LOJ #2537 / 洛谷 P5298 「PKUWC2018」Minimax 一棵有根二叉树 \(\mathcal T\) . 定义结点 \(x\) ...

  2. npm中的安装环境依赖 -D,-S等等

    什么都不写:这样不会写入到package.json中,直接安装到node_modules中,不建议这样写 -g:全局安装 -D:开发依赖,适合我们在开发阶段使用的依赖,包名会被注册到package.j ...

  3. 优雅退出在Golang中的实现

    背景 为什么需要优雅关停 在Linux下运行我们的go程序,通常有这样2种方式: 前台启动.打开终端,在终端中直接启动某个进程,此时终端被阻塞,按CTRL+C退出程序,可以输入其他命令,关闭终端后程序 ...

  4. Luogu2420 让我们异或吧 (熟练剖分)

    \(dis[u] \bigoplus dis[v] = dis[u] \bigoplus dis[v] \bigoplus dis[lca\{x,y\}] \bigoplus dis[lca\{x,y ...

  5. Redis 19 整合SpringBoot

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 概述 Spri ...

  6. JDK数组阻塞队列源码深入剖析

    JDK数组阻塞队列源码深入剖析 前言 在前面一篇文章从零开始自己动手写阻塞队列当中我们仔细介绍了阻塞队列提供给我们的功能,以及他的实现原理,并且基于谈到的内容我们自己实现了一个低配版的数组阻塞队列.在 ...

  7. FormData 和表单元素(form)的区别

    Form 元素 <form>元素表示文档中的一个区域,此区域包含交互控件,用于向 Web 服务器提交信息(文件.字符).下面称之为表单元素或表单. 要向 Web 服务器提交信息,我们必须要 ...

  8. linux下用docker安装redis

    docker安装redis方法: 1.用命令来查看可用版本: docker search redis 2.拉取官方的最新版本的镜像:docker pull redis:latest 3.查看镜像:do ...

  9. [CF1500C] Matrix Sorting (模拟)

    场上最后十几秒交上去过掉了耶! 题面 这里有两个 N ∗ M N*M N∗M 的 E x c e l \rm Excel Excel 表格 A A A 和 B B B. 我们知道 E x c e l ...

  10. 【mido】python的midi处理库

    安装mido库:pip install mido pipy地址:https://pypi.org/project/mido/ mido官方文档:https://mido.readthedocs.io/ ...