hdu1054 Strategic Game---二分图匹配

原创 2013年12月01日 20:24:43

此题构建了一个二分图 x 和 y 均为全部点的集合

res=hungary () 为最大匹配数(边数)

但此题构建的二分图x=y 所以一半是重复的 最后要除2


匈牙利算法模板。。

/* **************************************************************************
//二分图匹配(匈牙利算法的DFS实现)
//初始化:g[][]两边顶点的划分情况
//建立g[i][j]表示i->j的有向边就可以了,是左边向右边的匹配

linker[i]=j 记录 i 点连接了 j 点 若没有相连的点 则-1

//g没有边相连则初始化为0
//uN是匹配左边的顶点数,vN是匹配右边的顶点数
//调用:res=hungary();输出最大匹配数
//优点:适用于稠密图,DFS找增广路,实现简洁易于理解
//时间复杂度:O(VE)
//***************************************************************************/

——kuangbin


#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
using namespace std;

int uN,n,m,linker[1505];
bool used[1505];
vector<int> mp[1505];

bool dfs(int u)
{
    int i;
    int l=mp[u].size();
    for(i=0;i<l;i++)
      if(!used[mp[u][i]])
      {
          used[mp[u][i]]=true;
          if(linker[mp[u][i]]==-1||dfs(linker[mp[u][i]]))//若该点没有点相连 则标记该点所连的点 返回
          {                                              //若该点有相连的点 则dfs该点 看是否存在增广路
              linker[mp[u][i]]=u;
              return true;
          }
      }
    return false;
}

int hungary()
{
    int res=0;
    int u;
    memset(linker,-1,sizeof(linker));
    for(u=0;u<uN;u++)//对x集里面每一个顶点dfs
    {
        memset(used,0,sizeof(used));
        if(dfs(u)) res++;//若存在增广路(包括他所连接的点没有匹配过)则res++
    }
    return res;
}

int main()
{
    int u,v,i,j;
    while(~scanf("%d",&n))
    {
        for(i=0;i<1505;i++)
            mp[i].clear();
        for(i=0;i<n;i++)
        {
            scanf("%d:(%d)",&u,&m);
            for(j=0;j<m;j++)
            {
                scanf("%d",&v);
                mp[u].push_back(v);
                mp[v].push_back(u);
            }
        }
        uN=n;
        printf("%d\n",hungary()/2);
    }
    return 0;
}


hdu 1054 Strategic Game 二分图的匹配,最小点覆盖数

Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solu...
  • winycg
  • winycg
  • 2016年03月21日 17:09
  • 160

hdu 1054 Strategic Game 最小顶点覆盖(二分图最大匹配)

#include #include #include #include #include #include using namespace std; const int maxn=1510...

hdoj1054 Strategic Game(二分图最大匹配求最小点覆盖)

Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)...
  • CqZtw
  • CqZtw
  • 2017年06月03日 11:27
  • 141

HDU1054 Strategic Game(二分图最小点集覆盖,König定理)

Problem Description Bob enjoys playing computer games, especially strategic games, but sometime...

HDU 1054 Strategic Game 二分图最小点覆盖

题意:给你一颗树,一个点可以占领跟它连的所有的边。问最少需要多少个这样的点?思路:一眼就是染色之后二分图最小点覆盖。坑点:T得我不能自理,发现是边数组开小了,我加的双向边,也是爽。 http://...
  • NMfloat
  • NMfloat
  • 2015年12月14日 19:02
  • 206

HDU 1054 Strategic Game(二分图 匈牙利算法)

Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solu...

HDU1054Strategic Game【二分图最大独立集】

Problem Description Bob enjoys playing computer games, especially strategic games, but sometimes ...

HDU 1054 Strategic Game 二分图 最小顶点覆盖

做该题要掌握以下两点: 1、二分图最小顶点覆盖 = 双向二分图最大匹配 / 2 。 2、利用STL中的vector的可以很方便的建立图的邻接表存储。主要用到push_back()、clear()操...

HDU 1054 Strategic Game 二分匹配 | 树型DP | 贪心

Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others...

hdu 1054 Strategic Game(模板) 最大二分匹配,最小点覆盖 匈牙利算法

给定一图求最小点覆盖。 最大二分匹配=最小点覆盖 bfs版匈牙利算法 #include #include #include #include using namespace std; const in...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu1054 Strategic Game---二分图匹配
举报原因:
原因补充:

(最多只允许输入30个字)