思路:先有每个儿子向所有他喜欢的姑娘建边,对于最后给出的正确匹配,我们建由姑娘到相应王子的边。和某个王子在同一强连通分量,且王子喜欢的姑娘都是该王子能娶得。思想类似匈牙利算法求匹配的时候,总能找到增广路径。
代码比较烂,跑了近6s。
#include#include #include #include #include #include #define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))#define Maxn 4010#define Maxm 400010using namespace std;int dfn[Maxn],low[Maxn],vi[Maxn],Stack[Maxn],head[Maxn],id[Maxn],n,e,lab,num,top,ans[Maxn],match[2010][2010];struct Edge{ int u,v,next;}edge[Maxm];vector q[Maxn];void init(){ memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(vi,0,sizeof(vi)); memset(head,-1,sizeof(head)); memset(id,0,sizeof(id)); memset(match,0,sizeof(match)); for(int i=0;i