二分图的独立数
入门题:POJ1466
想用C练练手,于是抄的是这里,为了省事抄的是现成的C++,但是不知为什么TLE了,这位的代码可以AC,理论上他用的邻接矩阵更慢才对啊。
总之,记住二分图最大独立数=顶点数-最大匹配数
另外,这道题没有直接标明哪个是boy哪个是girl,原来以为要自己判断一下,但是根据别人的程序,直接求匹配数/2即为实际匹配的数目,其实并不难,纸上画一下就能理解了,求到右边的节点时因为左边的结点link都为0,所以匹配数多算了一次。
《算法艺术与信息学竞赛》P332
我的TLE代码
#include <stdio.h> #include <string.h> #define MAXN 505 int g[MAXN][MAXN],link[MAXN]; bool used[MAXN]; int n, nx, ny, match; bool find(int x) { for (int i = 1; i <= g[x][0]; i++) { int k = g[x][i]; if (!used[k]) { used[k] = true; if (link[k] == -1 || find(link[k]) ) { link[k] = x; return true; } } } return false; } void hungary() { memset(link, -1, sizeof(link)); for (int i = 0; i < nx; i++) { memset(used, false, sizeof(used)); if (find(i)) match++; } } int main() { int n; while (scanf("%d", &n)!=EOF) { nx = ny = n; for (int i = 0; i < nx; i++) { int x; char c,cc,str[10]; scanf("%d%c", &x,&c); g[x][0] = 0; scanf(" %c%d%c",&c, &g[x][0], &cc); for (int j = 1; j <= g[x][0]; j++) scanf("%d",&g[x][j]); match = 0; hungary(); } printf("%d\n",nx-match/2); } return 0; }