noi.ac-CSP模拟Day5T1 组【二分图最大匹配】
虽然是T3,但是想通了之后还是不难的。
数据规模也不大。
可以考虑先枚举一个班长,根据题意,和班长连边的学生就可以不用管,没有和班长连边的学生就要去找一个和班长连边的学生组队,如果所有没有和班长连边的学生都能找到一个人组队,就可以。
是一个比较裸的二分图最大匹配。
注意要重新建图,不能直接在原来的图上跑,因为有可能和班长连边的学生之间存在彼此连边的情况,就不符合二分图的定义。
可以另建图跑最大流,也可以就匈牙利,或者$EK$
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<cstdlib>
using namespace std;
#define N 1005
#define ll long long
#define INF 0x3f3f3f3f
int n,m;
vector<int>G[N],T[N];
bool vis[N],flag[N];
int mch[N];
bool dfs(int u)
{
for(int i=;i<T[u].size();i++)
{
int v=T[u][i];
if(vis[v]) continue;
vis[v]=;
if(mch[v]==||dfs(mch[v]))
{
mch[v]=u;
mch[u]=v;
return ;
}
}
return ;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=;i<=m;i++)
{
int u,v;scanf("%d %d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
for(int s=;s<=n;s++)//枚举班长
{
if(G[s].size()<((n-)/)) continue;//如果班长连的学生太少
int res=,num=n-G[s].size()-/*还有一个自己*/;
for(int i=;i<=n;i++)
T[i].clear(),flag[i]=/*标记是否与班长相连*/,mch[i]=;
mch[s]=-,flag[s]=/*防止班长被建到图里面去*/;
for(int i=;i<G[s].size();i++)
flag[G[s][i]]=;
for(int i=;i<G[s].size();i++)
{
int v=G[s][i];
for(int j=;j<G[v].size();j++)
if(!flag[G[v][j]])
T[v].push_back(G[v][j]);
}
for(int i=;i<G[s].size();i++)
{
memset(vis,,sizeof(vis));
if(dfs(G[s][i]))
res++;
}
if(res>=num)
{
puts("Yes");
for(int i=;i<n;i++)
printf("%d ",mch[i]);
printf("%d\n",mch[n]);
return ;
}
}
puts("No");
return ;
}
Code
noi.ac-CSP模拟Day5T1 组【二分图最大匹配】的更多相关文章
- 【bzoj3291】Alice与能源计划 模拟费用流+二分图最大匹配
题目描述 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验. 为了方便,我们可以将火星抽象成平面,并建立平面直角坐标系.火星上一共有N个居民点 ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- NOI.AC NOIP模拟赛 第二场 补记
NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- NOI.AC NOIP模拟赛 第四场 补记
NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- NOI.AC WC模拟赛
4C(容斥) http://noi.ac/contest/56/problem/25 同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形). 问题变 ...
- [NOI.AC 2018NOIP模拟赛 第三场 ] 染色 解题报告 (DP)
题目链接:http://noi.ac/contest/12/problem/37 题目: 小W收到了一张纸带,纸带上有 n个位置.现在他想把这个纸带染色,他一共有 m 种颜色,每个位置都可以染任意颜色 ...
随机推荐
- python查询mysql数据(3)
python查询mysql数据(3) """数据查询""" import pymysql import datetime from pymy ...
- win7系统安装虚拟网卡进行与Linux虚拟机的通信
有网络情况下,安装Linux时选择网桥即可实现Window与Linux直接通信. 无网络情况下,最简单的方法是在window系统中安装虚拟网卡,以进行与Linux的通信,步骤如下: (1)右击“我的计 ...
- SIM800c收发短信及AT指令
一.sim800设备安装 淘宝搜索sim800,差不多就是这么个样子 购买之后,安装手机卡,卡的缺口向外插入,会有卡住的感觉,再按一下卡会弹出 安装usb转串口驱动(CH340),设备的指示灯先是快闪 ...
- struts2没有打印日志原因和No result defined for action XXXAction and result input
在项目中调用一个action的方法的时候发生了一个错误,但是在catalina.out和配置的log4j都没有打印异常,后来在执行的action中加了logger.error("XXXXX& ...
- ORACLE获取BOM清单
BOM 结构如图 -- 1DH142-022 (DRIVE) -- 100729421 (PCBA) -- 100764148 (HDA) -- 100687050 (VCM) -- 100701 ...
- php 将几个变量合为数组,变量名和值对应
<?php $firstname = "Bill"; $lastname = "Gates"; $age = "60"; $resul ...
- java实现数据库之间批量插入数据
package comnf147Package; import java.sql.*; public class DateMigrationLagou { //连接SQLite private Con ...
- 【转】jQuery - 同时添加click和dblclick事件
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- 【转】diamond专题(四)—— 容灾机制
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- ES6 正则的扩展(待细读)
1.RegExp构造函数 在 ES5 中,RegExp构造函数的参数有两种情况. a.参数是字符串,这时第二个参数表示正则表达式的修饰符(flag) var regex = new RegExp('x ...