zoukankan      html  css  js  c++  java
  • [Ural1099]工作安排 带花树

    题目大意

    一般图最大匹配.

    题解:

    求解一般图最大匹配.
    直接使用带花树即可.
    (带花树也是刚学)...

    马上写带花树的ppt,会很通俗易懂.
    (充分证明了本苣智商不够,写不出高深的课件)

    如果有想要的依然可以直接私信我 QAQ

    带花树模板

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    typedef long long ll;
    inline void read(int &x){
        x=0;char ch;bool flag = false;
        while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
        while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
    }
    #define rg register int
    #define rep(i,a,b) for(rg i=(a);i<=(b);++i)
    #define per(i,a,b) for(rg i=(a);i>=(b);--i)
    const int maxn = 256;
    int n;
    bool map[maxn][maxn],inq[maxn],inBlo[maxn],mark[maxn];
    int link[maxn],fa[maxn],belong[maxn],q[maxn],l,r;
    inline void bloom(int x,int y){
        rep(i,0,n) mark[i] = inBlo[i] = false;
    #define nx(x) fa[link[(x)]]
        int lca;
        for(rg i=x;i;i=nx(i)) mark[i = belong[i]] = true;
        for(rg i=y;i;i=nx(i)){
            i = belong[i];
            if(mark[i]){lca = i;break;}
        }
        for(rg i=x;belong[i] != lca;i=nx(i)){
            if(belong[nx(i)] != lca) fa[nx(i)] = link[i];
            inBlo[belong[i]] = inBlo[belong[link[i]]] = true;
        }
        for(rg i=y;belong[i] != lca;i=nx(i)){
            if(belong[nx(i)] != lca) fa[nx(i)] = link[i];
            inBlo[belong[i]] = inBlo[belong[link[i]]] = true;
        }
    #undef nx
        if(belong[x] != lca) fa[x] = y;
        if(belong[y] != lca) fa[y] = x;
        rep(i,1,n) if(inBlo[belong[i]]){
            belong[i] = lca;
            if(!inq[i]) inq[q[++r] = i] = true;
        }
    }
    inline void modify(int s){
        int x,y,z = s;
        while(z){
            y = fa[z];x = link[y];
            link[y] = z;link[z] = y;
            z = x;
        }
    }
    inline void bfs(int s){
        rep(i,0,n){
            fa[i] = inq[i] = 0;
            belong[i] = i;
        }
        l = 0;r = -1;q[++r] = s;
        inq[s] = true;
        while(l <= r){
            int u = q[l++];
            rep(v,1,n){
                if(map[u][v] == 0 || belong[u] == belong[v] || link[u] == v) continue;
                if(s == v || link[v] && fa[link[v]]) bloom(u,v);
                else if(fa[v] == 0){
                    fa[v] = u;
                    if(link[v] != 0){
                        q[++r] = link[v];
                        inq[link[v]] = true;
                    }else{
                        modify(v);
                        return ;
                    }
                }
            }
        }return ;
    }
    int main(){
        read(n);int u,v;
        while(scanf("%d%d",&u,&v) != EOF){
            map[u][v] = map[v][u] = true;
        }
        rep(i,1,n) if(link[i] == 0) bfs(i);
        int ans = 0;
        rep(i,1,n) if(link[i] != 0) ++ ans;
        printf("%d
    ",ans);
        rep(i,1,n){
            if(link[i] > i) printf("%d %d
    ",i,link[i]);
        }
        return 0;
    }
    
  • 相关阅读:
    使用正则表达式,取得点击次数,函数抽离
    爬取校园新闻首页的新闻
    网络爬虫基础练习
    [PHP类] 分享一个强大的HTTP访问类(可做采集)
    php程序检测页面是否被百度收录
    php文章相似度计算 不用similar_text()函数
    php实现天干地支计算器示例 php算命程序
    Nginx 1.5.2 + PHP 5.5.1 + MySQL 5.6.10 在 CentOS 下的编译安装
    call和apply实现的继承
    Html语义化标签
  • 原文地址:https://www.cnblogs.com/Skyminer/p/6815608.html
Copyright © 2011-2022 走看看