Codeforces —1423B. Valuable Paper(二分+网络流求最大匹配)

   日期:2020-11-09     浏览:104    评论:0    
核心提示:B. Valuable Paper题目传送门:B. Valuable Paper题目大意:给你n个飞机场和n个造纸厂,飞机厂和造纸厂需要一一对应。有m条道路连接飞机场和造纸厂,通过第i条道路的时间为ti。要使所需要的道路的最大时间最小。思路:二分道路的最大值,然后跑网络最大流求二分图最大匹配,看能否达到所有机场和造纸厂一一对应。AC Code//二分最大边,加上网络流跑二分图匹配#include<bits/stdc++.h>using namespace std;const

B. Valuable Paper

题目传送门:
B. Valuable Paper

题目大意:

给你n个飞机场和n个造纸厂,飞机厂和造纸厂需要一一对应。有m条道路连接飞机场和造纸厂,通过第i条道路的时间为ti。要使所需要的道路的最大时间最小。

思路:

二分道路的最大值,然后跑网络最大流求二分图最大匹配,看能否达到所有机场和造纸厂一一对应。

AC Code

//二分最大边,加上网络流跑二分图匹配
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10,M=1e5+10,inf=1<<25;
struct Rode
{ 
    int u,v,t;
}rode[M];
int head[N*3],cent;
int n,m;//点数和边数
int maxflow;
int dep[N*3],ans[N*3],vir[N*3];
struct Node
{ 
    int ui,vi;
    int ti;
    int next;
}node[M*4];
void add(int u,int v,int t)
{ 
    node[cent].vi=v;
    node[cent].ti=t;
    node[cent].next=head[u];
    head[u]=cent++;
}
bool bfs()
{ //分层
    for(int i=0;i<=2*n+1;i++)
    { 
        dep[i]=0x3f3f3f3f;
        ans[i]=0;
        vir[i]=head[i];
    }
    queue<int>q;
    q.push(0);
    dep[0]=0;
    while(!q.empty())
    { 
        int now=q.front();
        q.pop();
        ans[now]=0;
        for(int i=head[now];~i;i=node[i].next)
        { 
            int to=node[i].vi;
            if(dep[to]>dep[now]+1&&node[i].ti)
            { 
                dep[to]=dep[now]+1;
                if(ans[to]==0)
                { 
                    ans[to]=1;
                    q.push(to);
                }
            }
        }
    }
    if(dep[2*n+1]!=0x3f3f3f3f) return 1;
    return 0;
}
int dfs(int u,int flow)
{ 
    int rlow=0;
    if(u==2*n+1)//如果到达了终点
    { 
        maxflow+=flow;
        return flow;
    }
    int used=0;
    for(int i=vir[u];~i;i=node[i].next)
    { 
        vir[u]=i;
        int d=node[i].vi;
        if(node[i].ti&&dep[d]==dep[u]+1)
        { 
            if(rlow=dfs(d,min(flow-used,node[i].ti)))
            { 
                used+=rlow;
                node[i].ti-=rlow;
                node[i^1].ti+=rlow;
                if(used==flow) break;
            }
        }
    }
    return used;
}
int Dinic()
{ 
    while(bfs())
    { 
        dfs(0,inf);
    }
    return maxflow;
}
int check(int f)
{ 
    memset(head,-1,sizeof(head));
    cent=0;
    for(int i=1;i<=n;i++)
    { 
        add(0,i,1);//将0作为超级源点,2*n+1作为超级汇点
        add(i,0,0);
        add(n+i,2*n+1,1);
        add(2*n+1,n+i,0);
    }
    for(int i=1;i<=m;i++)
    { 
        if(rode[i].t<=f)
        { //如果这条边满足要求
            add(rode[i].u,rode[i].v+n,1);
            add(rode[i].v+n,rode[i].u,0);
        }
    }
    maxflow=0;
    Dinic();
    if(maxflow<n) return 0;
    else return 1; 
}
int main()
{ 
    scanf("%d%d",&n,&m);
    int minn=inf,maxn=0;
    for(int i=1;i<=m;i++)
    { 
        scanf("%d%d%d",&rode[i].u,&rode[i].v,&rode[i].t);
        if(rode[i].t<minn) minn=rode[i].t;
        if(rode[i].t>maxn) maxn=rode[i].t;
    }
    int l=minn,r=maxn;
    int res=-1;
    while(l<=r)
    { 
        int mid=(l+r)/2;
        if(check(mid))
        { 
            res=mid;
            r=mid-1;
        }
        else l=mid+1;
    }
    printf("%d\n",res);
    //system("pause");
    return 0;
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服