hdu_1054(二分图)

      有点进步了,accepted 二分图

      1.最大匹配

      2.最小点覆盖(来源于最大匹配)

      hdu1054就是关于最小点覆盖的问题(貌似还能用树状DP,贪心算法来做,待完成),明白了最大匹配与最小点覆盖的关系这题也就easy 了

     

//静以修身
//答应自己的就不要失信
#include <iostream>
#include <vector>//如果换成<vector.h>就编译错误,但在codeblocks上可以通过
using namespace std;
const int Max=100000;
int link[Max],used[Max];
vector <int> v[Max];//用于图的记录
int Dfs(int k)//深度搜索,找出最大匹配数
{
    int i;
    //used[k]=1;
    for(i=0;i<v[k].size();i++)
    {
        int a=v[k][i];
        if(used[a]==0)
        {
            used[a]=1;
            if(link[a]==-1||Dfs(link[a]))
            {
                link[a]=k;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int i,count,a,n,b,t,k;
    while(cin>>n)
    {
        k=n;
        memset(link,-1,sizeof(link));
        for(i=0;i<n;i++)
        {
            v[i].clear();//细节决定成败
        }
        while(n--)
        {
            scanf("%d:(%d)",&a,&b);//以前一直用cin  这个还真nb
            while(b--)
            {
                cin>>t;
                v[a].push_back(t);
                v[t].push_back(a);//补全二分图

            }
        }
        count=0;
        for(i=0;i<k;i++)
        {
            memset(used,0,sizeof(used));
            if(Dfs(i))
              count++;
        }
        cout<<count/2<<endl;//因为遍历所有的点  多了一半
    }
    return 0;
}

  

   

原文地址:https://www.cnblogs.com/orangeblog/p/2257745.html