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 ",o++,flag?"Yes":"No"); } return 0; }