二分图匹配

2014-11-23 22:15:12 · 作者: · 浏览: 0

HDU 2063

求一个二分图的最大匹配。

完全的裸题。贴代码。

#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        using namespace std; vector
       
         G[1005]; bool check[1005]; int mac[1005]; int n; void add_edge(int from,int to) { G[from].push_back(to); G[to].push_back(from); } bool dfs(int u) { for(int i=0;i
        
         
HDU 2444

判断该图是否为二分图,如果是二分图就求该图的最大匹配。

判断是否为二分图是我用了一个DFS 也不知道还有没有更简单的方法。

#include
          
           
#include
           
             #include
            
              #include
             
               #include
              
                #include
               
                 #include
                
                  using namespace std; vector
                 
                   G[205]; bool check[205]; int mac[205]; int re[205]; void add_edge(int from,int to) { G[from].push_back(to); G[to].push_back(from); } bool rdfs(int u,int k) { re[u]=k; bool flag=true; int k1; if(k==1) k1=2; else k1=1; for(int i=0;i
                  
                   
HDU 1281

题意:一个棋盘上有一些地方能放“车” 求最多能放多少个,又有多少个点是关键点,关键点――删除这个点能放的“车”会变少。

把行归位X集合 列归为Y集合。每个点就是从X-Y的一条边。

进行二分图匹配。然后枚举边,求出删除这条边之后的最大匹配,如果比之前的少了 就是关键点。

#include
                    
                     
#include
                     
                       #include
                      
                        #include
                       
                         #include
                        
                          using namespace std; int mac[205]; bool check[205]; vector
                         
                           G[205]; int z,y; int n; int k[10005][2]; void add_edge(int from,int to) { G[from].push_back(to); G[to].push_back(from); } bool dfs(int u) { for(int i=0;i