题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054
求最小覆盖点,也就是求最大匹配,要用邻接表写,不然会TLE;当然也可以用HK算法;
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; #define N 1510 int vis[N], head[N], cnt, used[N], maps[N][N], n, ans; struct Edge { int v, next; } Edge[N*4];///要开大一点,我在这TLE了一次 void Add(int u, int v) { Edge[cnt].v = v; Edge[cnt].next = head[u]; head[u] = cnt++; } bool Find(int u) { for(int j=head[u]; j!=-1; j=Edge[j].next) { int v = Edge[j].v; if(!vis[v]) { vis[v] = 1; if(!used[v] || Find(used[v])) { used[v] = u; return true; } } } return false; } int main() { int a, b, m; while(scanf("%d", &n)!=EOF) { cnt = 0; memset(head, -1, sizeof(head)); for(int i=0; i<n; i++) { scanf("%d:(%d)", &a, &m); while(m--) { scanf("%d", &b); Add(a, b); Add(b, a); } } ans = 0; memset(used, 0, sizeof(used)); for(int i=0; i<n; i++) { memset(vis, 0, sizeof(vis)); if(Find(i)) ans++; } printf("%d ", ans/2); } return 0; }