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 种颜色,每个位置都可以染任意颜色 ...
随机推荐
- 红帽Linux故障定位技术详解与实例(3)
红帽Linux故障定位技术详解与实例(3) 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍然可以访问,故障处理人员可通过console, ssh等方式登录到操作系统上,在shell上执行 ...
- python 的ConfigParser模块
Python 之ConfigParser模块 一.ConfigParser简介 ConfigParser 是用来读取配置文件的包.配置文件的格式如下:中括号“[ ]”内包含的为section.sect ...
- Adboost几个要点分析
1.本质就是前向步进算法和加法模型,每一步计算分类器权重alpha和基分类器. 2.总体降低指数误差函数,转化为每一步降低分类误差率. 因为右边可以看作常数,所以相当于对这个进行优化 但是这一步可能做 ...
- python入门导读
很多培训机构宣称py是人工智能必备的编程语言,打着速成的旗号来引诱学者学习python.事实却并不是这样的,万丈高台平地起,不论你想从事怎样的编程工作,都是从最基本的编程技巧开始的:Python并不适 ...
- Entity Framework Core 迁移命令
Add-Migration init Update-Database init 修改model后,执行迁移的命令 更新数据库 每次更新都要{update}修改 Add-Migration {updat ...
- webbrowser 修改浏览器版本的方法
http://blog.csdn.net/herogui/article/details/51982474
- Springboot 默认静态路径
springboot 默认静态路径 代码如下所示 类ResourceProperties.class private static final String[] CLASSPATH_RESOURCE_ ...
- sql in条件 超过1000字符的处理方法
private string getOracleSQLIn(string[] ids, string field) { int count = Math.Min(ids.Length, 1000); ...
- 使用keil生成bin文件
相关文件 下载http://pan.baidu.com/share/link?shareid=478269&uk=1107426113 使用kei自带的工具的话是 打开Options f ...
- xpath元素定位方法
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集.这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似.XPath 含有超过 100 个内建的函数.这些函数用于字符串值.数值 ...