• LibreOJ #6002. 「网络流 24 题」最小路径覆盖


                            内存限制:256 MiB 时间限制:1000 ms 标准输入输出
                              题目类型:传统 评测方式:Special Judge
                                    上传者: 匿名

    网络流 最大流

    屠龙宝刀点击就送

    #include <cstring>
    #include <cstdio>
    #include <queue>
    #define N 6005
    #define inf 0x3f3f3f3f
    
    using namespace std;
    bool flag[N];
    int n,m,dep[N],nextt[N<<1],to[N<<1],flow[N<<1],head[N],cnt=1,Next[N];
    inline void ins(int u,int v,int l)
    {
        nextt[++cnt]=head[u];
        to[cnt]=v;
        flow[cnt]=l;
        head[u]=cnt;
    }
    bool bfs(int s,int t)
    {
        for(int i=s;i<=t;++i) dep[i]=-1;
        dep[s]=0;
        queue<int>q;
        q.push(s);
        for(int now;!q.empty();)
        {
            now=q.front();
            q.pop();
            for(int i=head[now];i;i=nextt[i])
            {
                int v=to[i];
                if(dep[v]==-1&&flow[i])
                {
                    dep[v]=dep[now]+1;
                    if(v==t) return true;
                    q.push(v);
                }
            }
        }
        return false;
    }
    inline int min(int a,int b) {return a>b?b:a;}
    int dfs(int now,int t,int Limit)
    {
        if(now==t||!Limit) return Limit;
        int f,ret=0;
        for(int i=head[now];i;i=nextt[i])
        {
            int v=to[i];
            if(dep[v]==dep[now]+1&&flow[i]&&(f=dfs(v,t,min(flow[i],Limit))))
            {
                if(v>n) flag[v-n]=1;
                flow[i]-=f;
                flow[i^1]+=f;
                Limit-=f;
                ret+=f;
                Next[now]=v;
                if(!Limit) break;
            }
        }
        if(Limit!=ret) dep[now]=-1;
        return ret;
    }
    int dinic(int s,int t)
    {
        int ret=0;
        for(;bfs(s,t);ret+=dfs(s,t,inf));
        return ret;
    }
    int Main()
    {
        scanf("%d%d",&n,&m);
        int s=0,t=n*2+1;
        for(int x,y;m--;)
        {
            scanf("%d%d",&x,&y);
            ins(x,y+n,inf);
            ins(y+n,x,0);
        }
        for(int i=1;i<=n;++i)
        {
            ins(s,i,1);ins(i,s,0);
            ins(i+n,t,1);ins(t,i+n,0);
        }
        int ans=n-dinic(s,t);
        for(int i=1;i<=n;++i)
        {
            if(flag[i]) continue;
            int now=i;
            printf("%d ",now);
            for(;Next[now];now=Next[now])
            {
                if(Next[now]>n) Next[now]-=n;
                printf("%d ",Next[now]);
            }
            printf("
    ");
        }
        printf("%d
    ",ans);
        return 0;
    }
    int sb=Main();
    int main(int argc,char *argv[]) {;}
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    让用户舒服起来 10个改善UI的技术
    Powerpoint快捷键大全
    自制Flash FLV视频播放器
    Firefox与IE在CSS样式表中的差异
    让你每天都充满积极性的五个方法
    asp.net 2实用技术汇总
    春季要健康 “排毒”三步走
    皮肤变好必遵守洗脸九法
    经典博客收集
    教你一招让网页用上漂亮的11PX中文字体
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7528692.html
Copyright © 2020-2023  润新知