FZU2232 炉石传说 最大匹配

思路:正好是二分图,自己敌人,符合条件的随从二人组建边,最大匹配为n是符合要求

#include <cstdio>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
typedef long long LL;
typedef pair<int,int>pii;
const int N=1e2+5;
const int INF=0x3f3f3f3f;
int match[N<<1],T,n;
bool vis[N<<1];
int a[N<<1],b[N<<1];
vector<int>g[N];
bool dfs(int u){
   for(int i=0;i<g[u].size();++i){
      int v=g[u][i];
      if(vis[v])continue;
      vis[v]=true;
      if(match[v]==-1||dfs(match[v])){
         match[v]=u;
         return true;
      }
   }
   return false; 
}
int main(){
    scanf("%d",&T);
    while(T--){
      scanf("%d",&n);
      for(int i=1;i<=2*n;++i){
         scanf("%d%d",&a[i],&b[i]);
      }
      for(int i=1;i<=n;++i)g[i].clear();
      for(int i=1;i<=n;++i)
        for(int j=n+1;j<=2*n;++j)
          if(a[i]>b[j]&&b[i]>=a[j])g[i].push_back(j);
      int ans=0;
      memset(match,-1,sizeof(match));
      for(int i=1;i<=n;++i){
        memset(vis,false,sizeof(vis));
        if(dfs(i))++ans;
      }

      if(ans==n)printf("Yes
");
      else printf("No
");
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/shuguangzw/p/5456872.html