hdu 1054 最小頂點覆蓋
阿新 • • 發佈:2018-11-02
二分圖的最小頂點覆蓋數等於二分圖的最大匹配數
// // main.cpp // wzazzy // // Created by apple on 2018/10/23. // Copyright © 2018年 apple. All rights reserved. // #include<stdio.h> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<string.h> #include<queue> #include<stack> #include<list> #include<map> #include<set> #include<vector> using namespace std; typedef long long int ll; const int maxn =1500+10; const int maxm=10000; const int mod =1e9+7; const int INF=0x3f3f3f3f; vector<int>g[maxn]; bool used[maxn]; int linker[maxn]; bool dfs(int u) { for(int i=0;i<g[u].size();i++) { int t=g[u][i]; if(!used[t]) { used[t]=1; if(linker[t]==-1||dfs(linker[t])) { linker[t]=u; return true; } } } return false; } int main(int argc, const char * argv[]) { int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { int u,v; scanf("%d:(%d)",&u,&v); for(int j=0;j<v;j++) { int a; scanf("%d",&a); g[u].push_back(a); g[a].push_back(u); } } int res=0; memset(linker,-1,sizeof(linker)); for(int i=0;i<n;i++) { memset(used,0,sizeof(used)); if(dfs(i)) res++; } printf("%d\n",res>>1); for(int i=0;i<maxn;i++)g[i].clear(); } return 0; }
另外,這道題還可以用樹形dp和貪心做,正在研究中。。。。