首页 > 其他分享 >All Pairs Maximum Flow题解

All Pairs Maximum Flow题解

时间:2023-09-07 20:57:02浏览次数:39  
标签:Pairs return int 题解 Flow flow res dinic fff

前置知识:

1. P3376 【模板】网络最大流

2.P4897 【模板】最小割树(Gomory-Hu Tree)

Ebola 有一句很著名的话

如果你乱搞过了我请你抽烟

那么这道题肯定不能普通的 dinic 直接水过去,不然就不是紫题了,那么直接祭出最小割树,复杂度 \(O(Tn^3m)\),但是因为 dinic 跑不满,所以是可以过的。

还有就是要注意 \(0\) 的情况,我的代码里特判了一下。最后就是要注意空格在行末不能输出。

#include<bits/stdc++.h>
#define int long long 
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}

const int M=80010;
const int N=410;
const int INF=1e15;

int n,S,T;
int d[M],now[M];
int tmp1[M],tmp2[M];
int node[M];
int anss[N][N];

struct liststar
{
    int u,v,w,nxt;
}e[M];
int cnt=1,head[M];
void add(int u,int v,int w){e[++cnt].nxt=head[u];head[u]=cnt;e[cnt].v=v;e[cnt].w=w;}
void addd(int u,int v,int w){add(u,v,w);add(v,u,0);}
void init(){for(int i=1;i<=cnt;i+=2)e[i].w+=e[i^1].w,e[i^1].w=0;}

bool bfs()
{
    std::queue<int>q;
    memset(d,0,sizeof(d));
    d[S]=1;now[S]=head[S];
    q.emplace(S);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=head[u],y;i;i=e[i].nxt)
            if(e[i].w && !d[y=e[i].v])
            {
                d[y]=d[u]+1;
                now[y]=i;
                q.emplace(y);
                if(y==T)return true;
            }
    }
    return false;
}

int fff(int x,int flow)
{
    if(x==T)return flow;
    int res=flow;
    for(int i=head[x],y;i && res;i=e[i].nxt)
    {
        now[x]=i;
        if(e[i].w && d[y=e[i].v]==d[x]+1)
        {
            int t=fff(y,min(e[i].w,res));
            if(!t)d[y]=0;
            res-=t;e[i].w-=t;e[i^1].w+=t;
        }
    }
    return flow-res;
}

int dinic()
{
    init();
    int res,maxn=0;
    while(bfs())while(res=fff(S,INF))maxn+=res;
    return maxn;
}

void work(int l,int r)
{
    if(l==r)return ;
    S=node[l];T=node[l+1];
    int t=dinic();
    anss[S][T]=anss[T][S]=t;
    int ss=S,tt=T,cnt1=0,cnt2=0;
    for(int i=l;i<=r;i++)
        if(d[node[i]])tmp1[++cnt1]=node[i];
        else tmp2[++cnt2]=node[i];
    for(int i=1;i<=cnt1;i++)node[i+l-1]=tmp1[i];
    for(int i=1;i<=cnt2;i++)node[i+l-1+cnt1]=tmp2[i];
    work(l,l+cnt1-1);
    work(l+cnt1,r);
    for(int i=1;i<=cnt1;i++)
        for(int j=1;j<=cnt2;j++)
        {
            int b=node[i+l-1],w=node[j+l-1+cnt1];
            anss[b][w]=anss[w][b]=min(min(anss[b][ss],anss[ss][tt]),anss[tt][w]);
        }
}

int read()
{
    int x=0,s=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar())if(ch=='-')s=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-48;
    return x*s;
}

signed main()
{
    int tot=0;
    int TT=read();
    while(TT--)
    {
        printf("Case #%lld:\n",++tot);
        for(int i=0;i<N;i++)
            for(int l=0;l<N;l++)anss[i][l]=INF;
        memset(e,0,sizeof(e));
        memset(head,0,sizeof(head));
        memset(now,0,sizeof(now));
        cnt=1;
        n=read();
        if(n==0)continue;
        for(int i=1;i<=n;i++)
            for(int l=1;l<=n;l++)
            {
                int x=read();
                addd(i,l,x);
            }
        for(int i=1;i<=n;i++)node[i]=i;
        work(1,n);
        for(int i=1;i<=n;i++)
        {
            for(int l=1;l<=n;l++)
            {
                if(anss[i][l]==INF)anss[i][l]=0;
                printf("%lld",anss[i][l]);
                if(l!=n)printf(" ");
            }
            puts("");
        }
    }
    return 0;
}

标签:Pairs,return,int,题解,Flow,flow,res,dinic,fff
From: https://www.cnblogs.com/LZMkingNB/p/17686001.html

相关文章

  • GitHub workflows env All In One
    GitHubworkflowsenvAllInOne$GITHUB_ENVdocsGITHUB_ENVenvironmentfile#把变量和值`>>`追加到GITHUB_ENV环境变量文件中echo"{environment_variable_name}={value}">>"$GITHUB_ENV"steps:-name:Setthevalueid:step_......
  • [题解] AtCoder Beginner Contest 308 A~G
    AtCoderBeginnerContest308A~GA.NewSchemevoidMain(){vector<i64>a(8);for(auto&x:a)cin>>x;if(!is_sorted(a.begin(),a.end())&&!all_of(a.begin(),a.end(),[](auto&x){returnx%25!=0||!(100......
  • CF1374E2 Reading Books(hard version) 题解
    CF1374E2ReadingBooks(hardversion)这道题是在CF1374E1ReadingBooks(easyversion)的基础上出的,而且仅仅增加了一个\(m\)的限制,下面的做法也是基于简单版的思路而想到的。建议先尝试简单版,然后尝试此题。题意简述:有\(n\)本书,每本书有一个阅读时间\(t_i\),和属性\(......
  • Eclipse里做JBPM工作流gpd.xml中文乱码问题解决
         刚开始接到是做一个简单的文档借阅流程,对于流程定义是采用eclipse中的jbpm插件,但存在一个问题是节点中文命名的在gpd.xml中全部为乱码或根本看不到任何东西。     但是网上有人说没关系,这只是eclipse本身存在的一个bug,在项目所在硬盘目录下打开该文件还是显示正常......
  • 题解 [NOIP2018 提高组] 赛道修建
    题目链接挺综合的一道题目。询问最小值最大,考虑二分最小值,二分上下界是\([最小边权,树的直径]\),但是为了方便我们直接设为\([1,5\times10^8]\)即可。考虑如何\(check\),可以采用类似树形\(dp\)的方式进行贪心。对于节点\(u\)的子树,\(u\)内部的点显然可以构成几条链,同......
  • 【PCL】使用kdtree时pop_t报错问题解决
    问题描述在使用kdtree时,遇到的报错,具体报错信息如下:提示找不到pop_t,点击错误信息会进入到dist.h文件中问题解决解决办法很简单,在这里简单总结一下进入dist.h文件中,将下面这行代码,应该是在源文件的503行:typedefunsignedlonglongpop_t;具体位置如下图所示:将这行代码......
  • FTP权限问题解析,553 Can't open that file: Permission denied
    FTP权限问题解析,553Can'topenthatfile:Permissiondenied FTP上传文件,提示553Can'topenthatfile:Permissiondenied原因:目录的所属组,所属用户属于root,导致FTP无法上传,修改组和所属用户为www即可chown-fRwww./*chgrp-fRwww./* ......
  • 9.6 CF1830 题解
    9.6CF1830题解A.CopilCopacDrawsTrees链接真弱智题不用讲B.TheBOSSCanCountPairs题意每组数据给你一个\(n\)和两个序列\(a,b\)。求有多少个数对\((i,j)\)满足\(1\lei<j\len\)且\(a_i\timesa_j=b_i+b_j\)。题解考虑\(a_i\timesa_j=b_i......
  • 学习tensorflow资源
    学习tensorflow先不要着急买书,买教程,先看看官网社区的教程资源,比什么都强。https://www.tensorflow.org/?hl=zh-cn再有就是tf.wiki的简单粗暴tensorflow2https://tf.wiki/zh_hans/最后在加上一个“文心一言”,不懂就问,精准学习。https://yiyan.baidu.com/都看完了,再说......
  • 1360C - Similar Pairs
    C.SimilarPairshttps://codeforces.com/problemset/problem/1360/C"""思路:1.因为n为偶数,所以偶数如果有偶数个的话,那么奇数也有偶数个,正好可以两两配对2.如果偶数为奇数个,那么奇数也是有奇数个,内部消化后多一个奇数和偶数3.剩下的奇数和偶数按相差是1计算,如......