URAL 1099 一般图带花树匹配

点击打开链接

题意:给n个人和许多关系,问能够匹配的人数和匹配的人

思路:据说是带花树的模版题,来练一练,原理什么的根本不是本弱可以理解的,权当是一个模版直接用算了,就像最大流一样,而且据本弱做的一些弱题发现这种题目考验的是建图的能力,也就是上边的所有的模版几乎不会动,然后直接建好图就行了,说白了就是太弱看不懂原理直接当模版使了

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3fll;
const int maxn=230;
int f[maxn],spouse[maxn],Next[maxn],Q[maxn],mark[maxn],vis[maxn];
int n,bot;
vectorG[maxn];
int find1(int x){
    if(x!=f[x]) f[x]=find1(f[x]);
    return f[x];
}
void unite(int a,int b){
    int aa=find1(a);
    int bb=find1(b);
    if(aa==bb) return ;
    f[aa]=bb;
}
int findLCA(int x,int y){
    static int t=0;
    t++;
    while(1){
        if(x!=-1){
            x=find1(x);
            if(vis[x]==t) return x;
            vis[x]=t;
            if(spouse[x]!=-1) x=Next[spouse[x]];
            else x=-1;
        }
        swap(x,y);
    }
}
void goup(int a,int p){
    while(a!=p){
        int b=spouse[a],c=Next[b];
        if(find1(c)!=p) Next[c]=b;
        if(mark[b]==2) mark[Q[bot++]=b]=1;
        if(mark[c]==2) mark[Q[bot++]=c]=1;
        unite(a,b);unite(b,c);a=c;
    }
}
void findaugment(int s){
    for(int i=0;ii) printf("%d %d\n",i+1,spouse[i]+1);
    }
    return 0;
}

你可能感兴趣的:(图论,最大匹配,线段树)