有点进步了,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;
}