UVALive 6525 Attacking rooks 二分匹配 经典题 全栈程序员-站长 • 2022年1月31日 下午9:00 • 未分类 • 阅读 49 UVALive 6525 Attacking rooks 二分匹配 经典题 大家好,又见面了,我是全栈君。 题目链接: <pre name="code" class="cpp">#pragma comment(linker, "/STACK:1024000000,1024000000") #include<bits/stdc++.h> template <class T> inline bool rd(T &ret) { char c; int sgn; if(c=getchar(),c==EOF) return 0; while(c!='-'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); ret*=sgn; return 1; } template <class T> inline void pt(T x) { if (x <0) { putchar('-'); x = -x; } if(x>9) pt(x/10); putchar(x%10+'0'); } using namespace std; const int N = 10105; struct Edge{ int to, nex; }edge[N*2]; int head[N], edgenum; void init(){memset(head, -1, sizeof head); edgenum = 0;} void add(int u, int v){ Edge E = {v, head[u]}; edge[edgenum] = E; head[u] = edgenum++; } int lef[N], pn; int tim, T[N]; bool match(int x){ for(int i=head[x]; ~i; i=edge[i].nex) { int v = edge[i].to; if(T[v] != tim) { T[v] = tim; if(lef[v] == -1 || match( lef[v] )) //match(lef[v]) : 原本连接v的X集点 lef[v] 能不能和别人连。假设能 则v这个点就空出来和x连 { lef[v] = x; return true; } } } return false; } int solve(){ int ans = 0; memset(lef, -1, sizeof(lef)); for(int i = 1; i<= pn; i++)//X集匹配。X集点标号从 1-pn 匹配边是G[左点].size() { tim++; if( match( i ) ) ans++; } return ans; } int n, siz, s[105][105], l[105][105], mp[105][105]; char str[105]; void input(){ siz = n; for(int i = 1; i <= n; i++) { scanf("%s", str+1); for(int j = 1; j <= n; j++){ if(str[j] == 'X') mp[i][j] = ++siz; else mp[i][j] = 0; } } } void build(){ for(int i = 1; i <= n; i++) s[0][i] = i; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(mp[i][j]) s[i][j] = mp[i][j]; else s[i][j] = s[i-1][j]; for(int i = 1; i <= n; i++) l[i][n+1] = i; for(int i = n; i; i--) { for(int j = 1; j <= n; j++) if(mp[j][i]) l[j][i] = mp[j][i]; else l[j][i] = l[j][i+1]; } init(); pn = siz; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(mp[i][j] == 0) add(l[i][j+1], s[i-1][j]); } int main(){ tim = 1; memset(T, 0, sizeof T); while(cin>>n){ input(); build(); cout<<solve()<<endl; } return 0; } /* 5 X.... X.... ..X.. .X... ....X 3 .X. XXX XXX 3 .X. X.X XXX 3 .X. X.X X.X 3 .X. X.X .X. 3 XXX XXX XXX 15 XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX */ 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115695.html原文链接:https://javaforall.net 赞 (0) 全栈程序员-站长 0 0 生成海报 相关推荐 iphone上的设备管理去哪里了_iPhone设备管理在哪里找 iphone上的设备管理去哪里了_iPhone设备管理在哪里找正常是没有设备管理的选项的,当你的iPhone上有未信任程序(已经安装好的才行,正在下载/安装的都不算)时才会有这个选项设置>通用>设备管理 全栈程序员-站长 2022年8月4日 11 MyBatis架构与源码分析<资料收集> MyBatis架构与源码分析<资料收集> 全栈程序员-站长 2021年6月15日 97 什么叫结构化数据半结构化数据和非结构化数据(xml是非结构化数据) 计算机信息化系统中的数据分为结构化数据和非结构化数据、半结构化数据。结构化数据结构化数据,是指由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。也称作行数据,一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。比如: id name gen… 全栈程序员-站长 2022年4月17日 53 socket常用函数_socket recv函数 socket常用函数_socket recv函数摘要在linux下,使用socketpair函数能够创建一对套节字进行进程间通信(IPC)。函数原形:#include<sys/types.h>#include<sys/socket.h>intsocketpair(intdomain,inttype,intprotocol,intsv[2]);参数1(domain):表示协… 全栈程序员-站长 2022年10月14日 2 盘点五款好用的项目管理软件 盘点五款好用的项目管理软件好用的项目管理软件有哪些?对于很多从事项目开发与设计的团队都会有这样的需求,一款优秀的项目进度管理软件在企业项目实施中有着极为重要的作用,它伴随着项目计划、定义、监控、控制以及确认交付的全部过程。那么面对市场上众多的企业项目进度管理软件,有哪些项目管理软件比较好呢?本文将盘点分析市面上常见几款甘特图软件,以帮助大家能够找到适合自己的工具。|EdrawProject这是一款专业的项目管… 全栈程序员-站长 2022年5月29日 49 idea idea热部署且开启自动编译「建议收藏」 idea热部署且开启自动编译「建议收藏」最近调试代码需要起服务并修改代码这就导致重复工作,目前是修改服务器配置,即当idea失去焦点时更新类和资源,但是这种只支持在debug模式且是在idea失去焦点才会触发热部署,这就相对加载的慢了。此法的配置方法:Run–>EditConfigguration如果你sever选项卡下没有Onframedeactivation,那么就需要配置Deployment选项… 全栈程序员-站长 2022年6月12日 115 发表回复您的邮箱地址不会被公开。 必填项已用 * 标注昵称: 邮箱: 网址: 记住昵称、邮箱和网址,下次评论免输入 提交