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