码迷,mamicode.com
首页 > 其他好文 > 详细

ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)

时间:2018-09-19 22:02:53      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:main   bit   icp   clu   c++   lag   二分图   集合   网络流   

https://nanti.jisuanke.com/t/31447

题意

一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间

分析

最大流不太会。。

贪心做法:

考虑两个集合A和B,A为L<=d[i]<=R,B为d[i]>R

枚举每个边

1.如果u和v都在B集合,直接删掉
2.如果u和v都在A集合,无所谓
3.如果u在B,v在A,并且v可删边即d[v]>L
4.如果u在A,v在B,并且u可删边即d[u]>L

最后枚举N+M个点判断是否在[L,R]之间

正解是有汇源上下界网络流,待补

#include<bits/stdc++.h>
using namespace std;

const int maxn=6005;

int main()
{
    int N,M,K,L,R,o=1,u[maxn],v[maxn],d[maxn];
    while(scanf("%d%d%d",&N,&M,&K)!=EOF)
    {
        memset(d,0,sizeof d);
        scanf("%d%d",&L,&R);
        int sum=0,flag=1;
        for(int i=0;i<K;i++)
        {
            scanf("%d%d",&u[i],&v[i]);v[i]+=N;
            d[u[i]]++,d[v[i]]++;
        }
        for(int i=0;i<K;i++)
        {
            int uu=u[i],vv=v[i];
            if(d[uu]>R&&d[vv]>R)d[uu]--,d[vv]--;
            else if(L<=d[uu]&&d[uu]<=R&&L<=d[vv]&&d[vv]<=R)continue;
            else if(L+1<=d[uu]&&d[uu]<=R&&d[vv]>R)d[uu]--,d[vv]--;
            else if(d[uu]>R&&L+1<=d[vv]&&d[vv]<=R)d[uu]--,d[vv]--;
        }
        for(int i=1;i<=N+M;i++)if(d[i]<L||d[i]>R)flag=0;
        printf("Case %d: %s\n",o++,flag?"Yes":"No");
    }
    return 0;
}

 

ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)

标签:main   bit   icp   clu   c++   lag   二分图   集合   网络流   

原文地址:https://www.cnblogs.com/fht-litost/p/9676615.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!