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

hdu 3729

时间:2017-07-29 22:24:04      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:二分图   ace   blog   ons   stream   二分图匹配   sort   turn   print   

二分图匹配,应该叫匈牙利算法,以前做过这种题,看明白了思想,板子忘了,无奈只能看白书上的板子,这个板子有点乱,比如1,2,3匹配1,2,3就会乱匹配,建议还是去网上学学好的板子,这里我用x和N+X区分了匹配项

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=100000+10;
vector<int> G[2*maxn];
int match[maxn*2];
bool used[maxn*2];
int n,t;
bool dfs(int v)
{
     used[v]=true;
    for(int i=0;i<G[v].size();i++)
    {
        int u=G[v][i],w=match[u];
        if(w<0||!used[w]&&dfs(w))
        {
            match[u]=v;
            match[v]=u;
            return true;
        }
    }
    return false;
}
int main()
{
     scanf("%d",&t);
   while(t--)
   {
       for(int i=1;i<=n;i++)
        G[i].clear();
       scanf("%d",&n);
       for(int i=1;i<=n;i++)
       {
              int a,b;
             scanf("%d%d",&a,&b);
             a=100000+a;//区分匹配项
             b=100000+b;
            for(int j=a;j<=b;j++)
            {
                G[i].push_back(j);
                G[j].push_back(i);
            }
       }
       int res=0;
       int cc[70];
         memset(match,-1,sizeof(match));
          for(int i=n;i>=1;i--)
          {
              if(match[i]<0)
              {
                  memset(used,0,sizeof(used));
                  if(dfs(i))
                  {
                      cc[res]=i;
                      res++;
                  }

              }
          }
        sort(cc,cc+res);
        printf("%d\n",res);
        for(int i=0;i<res;i++)
        {
            if(i) printf(" ");
            printf("%d",cc[i]);
        }
      printf("\n");
   }
    return 0;
}

 

hdu 3729

标签:二分图   ace   blog   ons   stream   二分图匹配   sort   turn   print   

原文地址:http://www.cnblogs.com/Wangwanxiang/p/7257566.html

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