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; }