首先是要构造二分图,然后二分图的最大匹配。
还有没完全证明过我的方法的正确性,但是AC了.....
#include#include #include #include #include #include using namespace std;const int INF=0x7FFFFFFF;const int maxn=200*200+10;const int Maxn=200+10;int N,M;int U[maxn],V[maxn];int F[Maxn];vector G[Maxn];int St;int dis[Maxn],flag[Maxn];queue Q;int Belong[Maxn];int nx,ny;int g[Maxn][Maxn];int cx[Maxn],cy[Maxn];int mk[Maxn];void init(){ for(int i=0; i<=N; i++) G[i].clear(); memset(F,0,sizeof F); memset(Belong,0,sizeof Belong); for(int i=0; i<=N; i++) dis[i]=INF; nx=N,ny=N; memset(g,0,sizeof(g));}void SPFA(){ while(!Q.empty()) Q.pop(); memset(flag,0,sizeof flag); flag[St]=1; dis[St]=0; Q.push(St); while(!Q.empty()) { int h=Q.front(); Q.pop(); flag[h]=0; for(int i=0; i