求二分图的最小点覆盖数,即求最大匹配数 把行看为左点集,列看为优点集,每个坐标点对于一条线,选择一行或一列打炮,就把与它相连的线全部覆盖,这样打的最少的炮就是最小覆盖数 代码: #include<iostream> using namespace std; int n; int g[501][501],u[501],link[501]; int dfs(int t) { for(int i=1;i<=n;i++) { if(g[t][i]&&!u[i]) { u[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=t; return 1; } } } return 0; } int hungary() { int i,num=0; memset(link,-1,sizeof(link)); for(i=1;i<=n;i++) { memset(u,0,sizeof(u)); if(dfs(i)) num++; } return num; } int main() { int i,k,a,b; cin>>n>>k; for(i=1;i<=k;i++) { scanf("%d%d",&a,&b); g[a][b]=1; } printf("%d/n",hungary()); system("pause"); return 0; }