一开始是用二分图匹配(网络流)+二分做的,后来发现直接用匈牙利更简单

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define pii pair<int,int>
#define X first
#define Y second
#define INF 0x7f7f7f7f
#define MAXN 1000+10
using namespace std;
struct Edge{
int from,to,cap,flow;
Edge(int u=,int v=,int c=,int f=){
from=u,to=v,cap=c,flow=f;
}
};
struct Dinic{
int n,m,s,t;
vector<Edge> edges;
vector<int> G[MAXN<<];
int d[MAXN<<];
int b[MAXN<<];
int cur[MAXN<<];
void init(int n,int s,int t){
this->n=n;
this->s=s,this->t=t;
edges.clear();
for(int i=;i<=n;i++){
G[i].clear();
}
}
void AddEdge(int x,int y,int cap){
edges.push_back(Edge(x,y,cap,));
edges.push_back(Edge(y,x,,));
m=edges.size();
G[x].push_back(m-);
G[y].push_back(m-);
}
bool BFS(){
memset(b,,sizeof(b));
queue<int> q;
d[s]=;
q.push(s);
b[s]=;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=;i<G[x].size();i++){
Edge &e=edges[G[x][i]];
if(e.cap>e.flow&&!b[e.to]){
q.push(e.to);
b[e.to]=;
d[e.to]=d[x]+;
}
}
}
return b[t];
}
int dfs(int x,int a){
if(x==t||!a)return a;
int flow=,f;
for(int &i=cur[x];i<G[x].size();i++){
Edge &e=edges[G[x][i]];
if(d[e.to]==d[x]+&&(f=dfs(e.to,min(a,e.cap-e.flow)))>){
edges[G[x][i]].flow+=f;
edges[G[x][i]^].flow-=f;
flow+=f;
a-=f;
if(!a){
break;
}
}
}
return flow;
}
int Maxflow(){
int flow=;
while(BFS()){
memset(cur,,sizeof(cur));
flow+=dfs(s,INF);
}
return flow;
}
}D;
int n,m;
pii a[MAXN];
int s[MAXN];
void print(int x){
for(int i=;i<D.edges.size();i++){
Edge &e=D.edges[i];
if(e.flow>=&&n+<=e.to&&e.to<=n+x){
s[e.to-n]=e.from;
}
}
for(int i=;i<=x;i++){
printf("%d\n",s[i]-);
}
}
void init(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d%d",&a[i].X,&a[i].Y);
a[i].X++,a[i].Y++;
}
}
int check(int x){
D.init(n+x+,,n+x+);
for(int i=;i<=n;i++){
D.AddEdge(,i,);
}
for(int i=;i<=x;i++){
D.AddEdge(a[i].X,n+i,);
D.AddEdge(a[i].Y,n+i,);
D.AddEdge(n+i,n+x+,);
}
int ans=D.Maxflow();
return (ans==x);
}
void solve(){
int L=,R=m;
while(R-L>){
int mid=(L+R)/;
if(check(mid)){
L=mid;
}
else{
R=mid;
}
}
if(check(R)){
printf("%d\n",R);
print(R);
}
else if(check(L)){
printf("%d\n",L);
print(L);
}
}
int main()
{
//freopen("data.in","r",stdin);
init();
solve();
return ;
}
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define pii pair<int,int>
#define X first
#define Y second
#define INF 0x7f7f7f7f
#define MAXN 1000+10
using namespace std;
int n,m;
int girl[MAXN],boy[MAXN];
int used[MAXN];
int a[MAXN][];
bool find(int x){
for(int i=;i<=;i++){
int y=a[x][i];
if(!used[y]){
used[y]=;
if(!girl[y]||find(girl[y])){
girl[y]=x;
boy[x]=y;
return ;
}
}
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
x++,y++;
a[i][]=x,a[i][]=y;
}
int ans=;
for(int i=;i<=m;i++){
memset(used,,sizeof(used));
if(find(i))
ans++;
else
break;
}
printf("%d\n",ans);
for(int i=;i<=ans;i++){
printf("%d\n",boy[i]-);
}
return ;
}

洛谷P2319 [HNOI2006]超级英雄的更多相关文章

  1. 洛谷 P2319 [HNOI2006]超级英雄

    题目描述 题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一 ...

  2. 洛谷P2319 [HNOI2006]超级英雄 题解

    题目链接: https://www.luogu.org/problemnew/show/P2319 分析 每错,这是一道海南不对是河南呀呀呀错了是湖南的省选题. 但是还是可以作为二分图第二题来练手的, ...

  3. [luogu P2319] [HNOI2006]超级英雄

    [luogu P2319] [HNOI2006]超级英雄 题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金. ...

  4. 洛谷 P2323 [HNOI2006]公路修建问题 解题报告

    P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...

  5. P2319 [HNOI2006]超级英雄 题解

    [HNOI2006]超级英雄 题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目, ...

  6. 【luogu P2319 [HNOI2006]超级英雄】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2319 #include <cstdio> #include <cstring> #i ...

  7. 洛谷P2320 [HNOI2006]鬼谷子的钱袋

    https://www.luogu.org/problem/show?pid=2320#sub 题目描述全是图 数学思维,分治思想 假设总数为n 从n/2+1到n的数都可以用1~n的数+n/2表示出来 ...

  8. 【题解】Luogu P2319 [HNOI2006]超级英雄

    原题传送门 这道题就是一个很简单的二分图匹配 二分图匹配详解 一开始想的是2-sat和网络流,根本没想匈牙利和HK 这道题只要注意一点:当一个点匹配不成功之后就直接退出 剩下的就写个二分图最大匹配就行 ...

  9. 洛谷P2323 [HNOI2006] 公路修建问题 [二分答案,生成树]

    题目传送门 公路修建问题 题目描述 OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Associa ...

随机推荐

  1. Beta Scrum Day 3

    听说

  2. C语言--第六周作业

    一.高速公路超速罚款 1.代码 #include<stdio.h> int main() { int a,b; float c; scanf("%d %d",& ...

  3. mongodb 数据备份与恢复

    备份 语法 mongodump -h dbhost -d dbname -o dbdirectory -h:服务器地址,也可以指定端口号 -d:需要备份的数据库名称 -o:备份的数据存放位置,此目录中 ...

  4. android 时间获取以及时间格式化

    Android中获取系统时间有多种方法,可分为Java中Calendar类获取,java.util.date类实现,还有android中Time实现 现总结如下: 方法一: void getTime1 ...

  5. 11-TypeScript中的名称空间

    在后端开发语言中,比如C#中,可以将不同源代码文件中的代码通过名称空间组合到一起.一般一个类定义在一个源代码文件中,在功能上属于一个上下文的源代码文件通过名称空间进行组织. 在TypeScript中, ...

  6. 流程控制语句(MySQL/MariaDB )

    本文目录:1.BEGIN...END2.true和false3.if结构4.case结构5.loop.leave和iterate6.repeat循环7.while循环 MySQL/MariaDB中的符 ...

  7. Linux入门(2)_给初学者的建议

    1 学习Linux的注意事项 严格区分大小写(命令, 文件, 选项) Linux中所有内容以文件形式保存, 包括硬件 硬盘文件是/dev/sd[a-p] 光盘文件是/dev/sr0等 Linux不靠扩 ...

  8. Python内置函数(52)——getattr

    英文文档: getattr(object, name[, default]) Return the value of the named attribute of object. name must ...

  9. sts中maven

    建立一个maven web的工程 网上有很多关于maven的下载,配置等,我这里就不多说了. 下面介绍主要介绍关于在sts中建立一个maven时最开始出现的错误问题. 创建maven工程 file-& ...

  10. Linux下的Shell编程(1)最简单的例子

    深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一. 从第一行开始 我们可以使用任意一种文字编辑器编写shell脚本,它必须以如下行开始(必须放在文件的第一行): #!/bi ...