ACM-ICPC 2018 瀋陽賽區網絡預賽 F Fantastic Graph(貪心或有源匯上下界網絡流)

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

題意網絡

一個二分圖,左邊N個點,右邊M個點,中間K條邊,問你是否能夠刪掉邊使得全部點的度數在[L,R]之間spa

分析code

最大流不太會。。blog

貪心作法:get

考慮兩個集合A和B,A爲L<=d[i]<=R,B爲d[i]>Rit

枚舉每一個邊class

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]之間di

正解是有匯源上下界網絡流,待補

#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;
}
相關文章
相關標籤/搜索