博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【题解】Luogu P2319 [HNOI2006]超级英雄
阅读量:4582 次
发布时间:2019-06-09

本文共 1524 字,大约阅读时间需要 5 分钟。

这道题就是一个很简单的二分图匹配

一开始想的是2-sat和网络流,根本没想匈牙利和HK

这道题只要注意一点:当一个点匹配不成功之后就直接退出

剩下的就写个二分图最大匹配就行了

完整代码(不想写HK

#include 
#define N 1005using namespace std;inline int read(){ register int x=0,f=1;register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); return x*f;}inline void write(register int x){ if(!x)putchar('0');if(x<0)x=-x,putchar('-'); static int sta[25];int tot=0; while(x)sta[tot++]=x%10,x/=10; while(tot)putchar(sta[--tot]+48);}struct node{ int to,next;}e[N<<1];int head[N],tot;inline void add(register int u,register int v){ e[++tot]=(node){v,head[u]}; head[u]=tot;}int n,m;int ask[N],matched[N],bematched[N];inline bool dfs(register int u){ for(register int i=head[u];i;i=e[i].next) { int v=e[i].to; if(ask[v]) continue; ask[v]=1; if(!matched[v]||dfs(matched[v])) { matched[v]=u; bematched[u]=v; return true; } } return false;}int main(){ n=read(),m=read(); for(register int i=1;i<=m;++i) { int x=read()+1,y=read()+1; add(i,x),add(i,y); } int ans=0; for(register int i=1;i<=m;++i) { memset(ask,0,sizeof(ask)); if(dfs(i)) ++ans; else break; } write(ans),puts(""); for(register int i=1;i<=ans;++i) write(bematched[i]-1),puts(""); return 0;}

转载于:https://www.cnblogs.com/yzhang-rp-inf/p/10081375.html

你可能感兴趣的文章
2、文件夹
查看>>
完整版本的停车场管理系统源代码带服务端+手机android客户端
查看>>
排序精讲
查看>>
【bzoj3172】 Tjoi2013—单词
查看>>
【uoj2】 NOI2014—起床困难综合症
查看>>
js return的用法
查看>>
子节点填充父元素除去一固定高度后的剩余高度
查看>>
[原]IOS 后台发送邮件
查看>>
(转)JAVA Calendar详解
查看>>
转: 编码,charset,乱码,unicode,utf-8与net简单释义
查看>>
C#--正则匹配
查看>>
5.30 考试修改+总结
查看>>
BA-设计施工调试流程
查看>>
C#-CLR各版本特点
查看>>
css3背景透明文字不透明
查看>>
《java JDK7 学习笔记》之接口与多态
查看>>
LeetCode 96:Unique Binary Search Trees
查看>>
kernel-char设备的建立
查看>>
DVWA-CSRF
查看>>
ubuntu common software introduction
查看>>