题目链接:点击查看

题目大意:给出一张无向图,问能否删除任意数量的边,使得每个点的度数都达到指定的数值,度数的取值范围为 [ 1 , 2 ]

题目分析:hdu的原题的弱化版https://blog.csdn.net/qq_45458915/article/details/107305865

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e3+100;const int M=N*N*2;int x[N],y[N],du[N],id[N][N];int n,m,que[M],ql,qr,pre[N],tim=0;struct edge
{int v,nxt;
}e[M];int h[N],tot=0;int match[N],f[N],tp[N],tic[N];int find(int x)
{return f[x]==x?f[x]:f[x]=find(f[x]);
}void addedge(int u,int v)
{e[++tot]=(edge){v,h[u]};h[u]=tot;
}int lca(int x,int y)
{for (++tim;;swap(x,y)) if(x) {x=find(x);if(tic[x]==tim) return x; else {tic[x]=tim;x=pre[match[x]];}}
}void shrink(int x,int y,int p)
{while(find(x)!=p) {pre[x]=y;y=match[x];if(tp[y]==2) {tp[y]=1;que[++qr]=y;}if(find(x)==x) f[x]=p;if(find(y)==y) f[y]=p;x=pre[y];}
}bool aug(int s)
{for(int i=1;i<=n;++i) f[i]=i;memset(tp,0,sizeof tp);memset(pre,0,sizeof pre);tp[que[ql=qr=1]=s]=1; // 1: type A ; 2: type Bint t=0;while(ql<=qr) {int x=que[ql++];for(int i=h[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v) {if(find(v)==find(x)||tp[v]==2) continue; if(!tp[v]) {tp[v]=2;pre[v]=x;if(!match[v]) {for(int now=v,last,tmp;now;now=last) {last=match[tmp=pre[now]];match[now]=tmp,match[tmp]=now;}return true;} tp[match[v]]=1,que[++qr]=match[v];} else if(tp[v]==1) {int l=lca(x,v);shrink(x,v,l);shrink(v,x,l);}}}   return false;
}int solve()
{int ans=0;for(int i=1;i<=n;i++)if(!match[i]&&aug(i))ans++;return ans;
}void init()
{tot=0;memset(id,0,sizeof(id));memset(match,0,sizeof(match));memset(tic,0,sizeof(tic));memset(h,0,sizeof(h));
}void build()
{int cnt=0;for(int i=1;i<=n;i++)for(int j=1;j<=du[i];j++)id[i][j]=++cnt;for(int i=1;i<=m;i++){addedge(cnt+1,cnt+2);addedge(cnt+2,cnt+1);for(int j=1;j<=du[x[i]];j++){addedge(id[x[i]][j],cnt+1);addedge(cnt+1,id[x[i]][j]);}for(int j=1;j<=du[y[i]];j++){addedge(cnt+2,id[y[i]][j]);addedge(id[y[i]][j],cnt+2);}cnt+=2;}n=cnt;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);while(scanf("%d%d",&n,&m)!=EOF){init();int sum=0;for(int i=1;i<=n;i++){scanf("%d",du+i);sum+=du[i];}for(int i=1;i<=m;i++)scanf("%d%d",x+i,y+i);build();if(sum&1)puts("No");else if(solve()*2==n)puts("Yes");elseputs("No");}return 0;
}

牛客多校 - 1 or 2(一般图最大匹配)相关推荐

  1. 牛客多校三 B Black and white

    牛客多校三 B Black and white 在n*m的棋盘上,每个格子有一个数,初始可以选一定的格子标记为黑色,在任意四个形如(i1, j1)(i1, j2)(i2, j1)(i2, j2)的格子 ...

  2. 2019牛客多校第一场

    2019牛客多校第一场 题号 题目 知识点 A Monotonic Matrix B Symmetric Matrix C Fluorescent 2 D Two Graphs E Removal F ...

  3. LCS(2021牛客多校4)

    LCS(2021牛客多校4) 题意: 让你构造三个字符串s1,s2,s3,长度均为n,要求LCS(s1,s2)=a,LCS(s2,s3)=b,LCS(s1,s3)=c 题解: 先考虑三个串互相LCS为 ...

  4. 24dian(牛客多校第三场)

    24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...

  5. 2018年牛客多校算法寒假训练营练习比赛(第一场)C. 六子冲

    2018年牛客多校算法寒假训练营练习比赛(第一场)C. 六子冲 题目链接 做法:模拟即可 #include <bits/stdc++.h> #define P pair<int,in ...

  6. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  7. 2022牛客多校(十)

    2022牛客多校(十) 一.比赛小结 比赛链接:"蔚来杯"2022牛客暑期多校训练营10 二.题目分析及解法(基础题) F.Shannon Switching Game? 题目链接 ...

  8. 2019牛客多校训练第十场F Popping Balloons

    2019牛客多校训练第十场F Popping Balloons 题意:二维平面内给你若干个点,然后你可以在x轴和y轴分别射三枪(每一枪的间隔是R),问最多能射掉多少气球. 题解:贪心.这个应该只能算作 ...

  9. 牛客多校第十场F-Popping Balloons

    题目连接 牛客多校F-PoppingBalloons 题意: 用枪打气球,可以横着打三次,竖着打三次,横着打可以把那一行的气球全打下来,竖着打可以把那一列的气球全打下来,但是,每两次相邻的横着打或者竖 ...

最新文章

  1. 不需要任何依赖的图片加载错误处理的工具类load-image.js
  2. 40.QT-QPropertyAnimationdong和QParallelAnimationGroup动画实现
  3. 1336:【例3-1】找树根和孩子
  4. CM: Create BAdI implementation for Webservice enabled word document
  5. 三个点拟合圆形的函数C#
  6. linux内核功能关闭透明大页 功能,redhat linux 7.4关闭透明大页
  7. 伯努利分布方差_统计分布--深入浅出统计学总结
  8. (36)VHDL实现或非门型RS触发器
  9. 浙大 PAT b1029
  10. 亮点抢先看,华为云 TechWave 大数据专题日有啥料?
  11. 多数据源切换(拦截器)
  12. 终于找到破坏(被锁)广联达云计价平台GCCP6.0工程文件的罪魁祸首,显示:您的工程可能受到盗版侵害……
  13. 数据库实验报告1数据库定义实验
  14. 汇编 - 实验 - 计算X+(Y-Z)=W
  15. 微信服务号使用微信支付
  16. Go语言泛型工具go2go
  17. PowerShell 实现批量下载文件
  18. 58同城MySQL30条军规
  19. VS2022+PCL 1.12.1
  20. C++运算符重载(详解)

热门文章

  1. 编写一个函数判断一个整数是不是素数c语言,设计一个函数,用来判断一个整数是否为素数。代码如下,按要求在空白处填写适当的表达式或语句,使...
  2. 认证(登录)功能需求分析
  3. 如何保证消息消费顺序呢?
  4. SpringMVC拦截器-快速入门详解(应用)
  5. 定义和使用含有泛型的类
  6. 登陆状态购物车数据结构
  7. 如何防止机器模拟请求
  8. 私有属性和方法-通过父类方法间接访问
  9. SpringBoot_日志-SpringBoot默认配
  10. Shell循环与结构化命令