题解 | C 萌新向题解二分图匹配与竞赛图综合题

C 萌新向题解二分图匹配与竞赛图综合题

题目链接

经验教训 :

  • 题中要求了 i,i+ni,i+n 之间没有边也就是转化形成的图是竞赛图且没有自环;
  • 要仔细看题 题中明确给出了是有 n(n1)÷2n\cdot(n-1) \div2 条边

相关前置知识

  • 完全图 是指每个顶点都和其他所有点有直接边相连的图;
  • 竞赛图就是有向完全图;
  • nn 阶图是指图中有 nn 个点;
  • 竞赛图一定是连通的,但不一定是强连通的;
  • 若竞赛图中包含环,那么图中至少包含三个点,即不存在二元环;
  • 哈密顿路径是指每个点都只经过一次的路径
  • 强连通分量是极大强连通子图;
  • 竞赛图必然存在哈密顿路径;
  • 图中存在哈密顿路径的充分必要条件是 图是连通的;
  • 图上孤立(出度和入度都是 00 )的点也算一个连通分量

思路

  • i,n+ji,n+j 之间有边看作是 iji\to j 的有向边,二分图就变成 nn 阶有向完全图即竞赛图
  • 即给出的二分图的最大匹配数的最小值是 n1n-1 .
    • 证明如下 假设哈密顿路径是 a1a2a3a4ai...ana_1 \to a_2 \to a_3 \to a_4 \to a_i \to...\to a_n
    • 则有如下 n1n-1 个匹配 a1a2+n,a2a3+n,...,an1an+na_1 \to a_2 + n, a_2 \to a_3+n,..., a_{n-1}\to a_n+n
  • 如果最大匹配数是nn ,则形成的竞赛图中所有的强连通分量是有环的;
    • 因为每一个点都有后继节点,最后会形成若干个环;
    • 每个环是强连通分量;

结论 如果在形成的竞赛图中每一个强连通分量中点的个数都大于 11 (至少为 33 )则能形成完美匹配

否则答案为 n1n-1

利用Tarjan\texttt{Tarjan} 算法实现强连通分量的寻找。

``

const int N= 3e3+2;
int dfn[N],low[N],timestamp;
bool in_stack[N];
bool flag = true;
int stk[N], top;
// scc 是强连通分量的英文缩写
int scc_cnt = 0;
int Size[N];
// 邻接表
vector<int> G[N];

void tarjan(int u){
    stk[++top] = u;
    in_stack[u] = true;
    low[u] = dfn[u] = ++timestamp;
    for(auto v : G[u]){
        if(!dfn[v]){
            tarjan(v);
            low[u] = min(low[u],low[v]);
        }
        else if(in_stack[v]){
            low[u] = min(low[u],dfn[v]);
        }
    }
    if(low[u] == dfn[u]){
        ++scc_cnt;
        int v;
        do{
            Size[scc_cnt]++;
            v = stk[top--];
            in_stack[v] = false;
        }while(u !=v);
    }
}

void solve(){
    int n; cin >> n;
    for(int i =1; i <= n; i++){
        for(int j =1; j <= n; j++){
            int e; cin >> e;
            if(e){
                G[i].push_back(j);
            }
        }
    }
    // 求强连通分量
    for(int i =1; i<=n; i++){
        if(!dfn[i]){
            tarjan(i);
        }
    }
    for(int i =1; i <= scc_cnt; i++){
        if(Size[i] < 2){
            flag = false;
            break;
        }
    }
    if(flag) cout << n ;
    else cout << n-1;
}

也可以使用兰道定理

兰道定理: 一个有向完全图(竞赛图)是强连通的充分必要条件是

将每个点的入度按从小大到排序形成序列did_i

对任意的1kn1 1\le k \le n-1

i=1kdi=(k2)\sum_{i = 1}^{k}d_i = \binom{k}{2}

都不成立

全部评论
给你磕一个,终于看懂了QAQ
点赞 回复 分享
发布于 2023-08-01 20:01 江苏
我想请教一下,这一题的输入是不是保证了如果有环,那环中点的个数一定大于等于3?,如果其他题没有这个输入保证的话是不是大于等于2就行了?
点赞 回复 分享
发布于 2023-08-02 10:21 河南
我认为输入并不保证如果有环 环中点的个数至少为3 可以为2 题目只保证了边的个数是 (n+1)*n/2
点赞 回复 分享
发布于 2023-08-02 10:32 河南

相关推荐

评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务