zoukankan      html  css  js  c++  java
  • 【BZOJ】1059: [ZJOI2007]矩阵游戏(二分图匹配)

    题目

    传送门:QWQ

    分析

    把行和列分别看做二分图的两个集合

    每一个在$ (x,y) $处的1,连接$ G[i]->j $

    然后跑二分图匹配

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=300;
    int s[maxn][maxn];
    int vis[maxn],n,matchy[maxn];
    vector<int> G[maxn];
    int hungary(int u){
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i];
            if(vis[v])continue; vis[v]=1;
            if(!matchy[v]||hungary(matchy[v])){
                 matchy[v]=u;
                return true;
            }
        }
        return false;
    }
    int main(){
         int t;
         scanf("%d",&t);
         while(t--){
             scanf("%d",&n);
             for(int i=0;i<=n;i++) G[i].clear();
             memset(matchy,0,sizeof(matchy));
             for(int i=1;i<=n;i++){
                 for(int j=1;j<=n;j++)
                 scanf("%d",&s[i][j]);
            }
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(s[i][j]==1) G[i].push_back(j);
                }
            }
            int ans=0;
            for(int i=1;i<=n;i++){
                memset(vis,0,sizeof(vis));
                if(hungary(i)) ans++;
            }
            if(ans==n) puts("Yes");
            else puts("No");
        //    printf("------------ %d
    ",ans);
         }
         return 0;
    }
    /*
    3
    2
    0 0
    0 1
    3
    0 0 1
    0 1 0
    1 0 0
    5 
    1 0 0 0 1
    0 0 1 0 0
    0 1 0 0 0
    0 0 1 0 0
    0 0 0 1 0
    */
  • 相关阅读:
    HDOJ 1877
    POJ 2210
    HDOJ 1230(火星A+B)
    大数想减
    HDU 2115
    HDOJ 1234
    HDOJ 3784
    HDOJ3782(xxx定理)
    C# 使用 Stopwatch 测量代码运行时间
    SQL返回当前天是星期几
  • 原文地址:https://www.cnblogs.com/noblex/p/9127618.html
Copyright © 2011-2022 走看看