题意:求哪些点一定在最大匹配中。
写过,再写一遍吧。
求哪些点不一定在最大匹配中。首先求一遍最大匹配,未匹配点当然不一定在最大匹配中。
设一个未匹配点为A,如果存在边A-B,且存在匹配边B-C,那么可以A替换C,即匹配边变成A-B。最大匹配数不会改变。 所以C,也就是与未匹配点相邻的点的匹配点,不一定在最大匹配中。 这样DFS一遍就行了,这儿的复杂度是\(O(n+m)\)。求最大匹配的时候,匈牙利不是\(O(nm)\)吗,竟然能过么。。
还是写一遍网络流。Dinic是\(O(\sqrt n m)\)的吧,ISAP是?ISAP这么慢的么==(虽然也是前15吧)。
//5592kb 1028ms#include#include #include //#define gc() getchar()#define MAXIN 300000#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)const int N=2e4+5,M=2e5+7+N+N/*边数*/,INF=2e9;int S,T,Enum,H[N],nxt[M],fr[M],to[M],cap[M],pre[N],lev[N],lk[N];bool vis[N];char IN[MAXIN],*SS=IN,*TT=IN;inline int read(){ int now=0;register char c=gc(); for(;!isdigit(c);c=gc()); for(;isdigit(c);now=now*10+c-'0',c=gc()); return now;}inline void AE(int u,int v,int w){ to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], H[u]=Enum, cap[Enum]=w; to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], H[v]=Enum, cap[Enum]=0;}bool BFS(){ static int q[N]; for(int i=S; i