int lef[N*N];//lef[v]表示右邊點v 當前連接的點 bool T[N*N];//右邊的點是否連過 vector<int>G[N];//G是映射,G[X集].push_back(Y集) 注意G的初始化 bool match(int x) { for(int i=0;i<G[x].size();i++) { int v=G[x][i]; if(!T[v]) { T[v]=true; if(lef[v]==-1||match(lef[v])) { lef[v]=x; return true; } } } return false; } void solve() { int ans=0; memset(lef,-1,sizeof(lef)); for(int i=0;i<pn-1;i++)//左右點集匹配,左點集是 0-(pn-1) 右點集是G[左點].size() { memset(T,0,sizeof(T)); if(match(i))ans++; } printf("%d\n",ans); }