码迷,mamicode.com
首页 > 其他好文 > 详细

FZU2232 炉石传说 最大匹配

时间:2016-05-03 23:48:38      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

思路:正好是二分图,自己敌人,符合条件的随从二人组建边,最大匹配为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\n");
      else printf("No\n");
    }
    return 0;
}
View Code

 

FZU2232 炉石传说 最大匹配

标签:

原文地址:http://www.cnblogs.com/shuguangzw/p/5456872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!