The main topic: slightly
Topic ideas: First find a maximum match, and then enumerate each edge. (Just beginning to feel good violence ...) But the truth is that it only used 31ms.
#include <stdio.h>#include<string.h>#include<algorithm>#include<iostream>using namespacestd;#defineMAXN 1500BOOLG[MAXN][MAXN], VIS[MAXN];intP[MAXN];intN, m, cas =1;BOOLFind (intu) { for(intI=1; i<=m; i++) { if(G[u][i] &&!Vis[i]) {Vis[i]=true; if(P[i] = =-1||Find (P[i])) {P[i]=u; return true; } } } return false;}intGetans () {memset (P,-1,sizeof(P)); intAns =0; for(intI=1; i<=n; i++) {memset (Vis,false,sizeof(VIS)); if(Find (i)) ans++; } returnans;}voidsolve () {intIMP =0, ans; Ans=Getans (); for(intI=1; i<=n; i++) { for(intj=1; j<=m; J + +) { if(!G[i][j])Continue; G[I][J]=false; if(Getans () < ans) IMP + +; G[I][J]=true; }} printf ("Board%d has%d important blanks for%d chessmen.\n", CAS + +, Imp, ans);}intMain () {intQ; while(SCANF (" %d%d%d", &n, &m, &q)! =EOF) {memset (G,false,sizeof(G)); while(Q--) { intA, B; scanf ("%d%d", &a, &b); G[A][B]=true; } solve (); } return 0;}
HDU 1281 Board Game