呵呵,小曹果然不负众望。
我知道的二分图最大匹配算法我也只知道匈牙利算法而已。
与你的不同之处在于你用的是DFS,而我用的是BFS。回头我要对比一下你我程序的差别。
展示一下我的WA代码吧。关于机枪能自毁这事当我看到它的攻击范围是从0开始时已经意识到了。
最近没有玩ACM的心情,休息一下。呵呵,就辛苦两位了。
我知道的二分图最大匹配算法我也只知道匈牙利算法而已。
与你的不同之处在于你用的是DFS,而我用的是BFS。回头我要对比一下你我程序的差别。
展示一下我的WA代码吧。关于机枪能自毁这事当我看到它的攻击范围是从0开始时已经意识到了。
最近没有玩ACM的心情,休息一下。呵呵,就辛苦两位了。
程序代码:
#include<stdio.h> #define M 100 int cal(int map[][M], int n) { int x[M] = {}, lx[M], mx[M]; int y[M] = {}, ly[M], my[M]; int c = 0, lxn, lyn, i, j, k, t; for(c = i = 0; i < n; i++) { if(x[i]) continue; for(j = 0; j < n; j++) mx[j] = my[j] = 0; mx[i] = 1; lx[0] = i; lxn = 1; lyn = 0; for(k = j = 0; j < lxn; j++) { for(t = 0; t < n; t++) { if(!map[lx[j]][t] || my[t]) continue; if(y[t]){ my[t] = 1; ly[lyn++] = t;} else{ x[i] = 1; y[t] = 1; c++; break;} } if(t != n) break; for(; k < lyn; k++) for(t = 0; t < n; t++) if(x[t] && map[t][ly[k]] && !mx[t]) { lx[lxn++] = t; mx[t] = 1; } } } return c; } int main() { int map[M][M], x[M], y[M], s[M], e[M]; int t, n, i, j, d; for(scanf("%d", &t); t--; printf("%d\n", cal(map, n))) { for(scanf("%d", &n), i = 0; i < n; s[i] *= s[i], e[i] *= e[i], i++) scanf("%d%d%d%d", &x[i], &y[i], &s[i], &e[i]); for(i = 0; i < n; i++) for(j = 0; j < n; j++) map[i][j] = (d = (d = x[i] - x[j]) * d + (d = y[i] - y[j]) * d) >= s[i] && d <= e[i]; } return 0; }
重剑无锋,大巧不工