D - Swap Free Gym - 102423D 二分图性质:补图最大团 = 点的个数 - 最大匹配数
题意:给你一个串的某些全排列,没有重的,让你求一个最大的集合能有多少个元素,集合的满足条件:交换一个串的任意两个位置上的字母,不能变成集合里的另一个串。
思路:如果一个串不能通过交换一次字母位置变成另一个串,就让这两个串建边。建好图之后,找一个最大完全图,表示任意两个都不能通过交换变成相同的串。但是提交后发现找最大团的算法会TLE,就要用到题目的性质了。补图最大团 = 点的个数 - 最大匹配数,这样我们就让能交换到达的建边。
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn = 505;
vector<int> ma[maxn];
char MAP[550][30];
int link[maxn];
bool vis[maxn]; bool dfs(int x){
int len = ma[x].size() - 1;
for(int i = 0; i <= len; i++){
int v = ma[x][i];
if(vis[v]) continue;
vis[v] = 1;
if(!link[v] || dfs(link[v])){
link[v] = x;
link[x] = v;
return 1;
}
}
return 0;
} int solve(int n){
int ans = 0;
for(int i = 1; i <= n; i++){
if(link[i]) continue;
for(int j = 1; j <= n; j++) vis[j] = 0;
if(dfs(i)) ans++;
}
return n - ans;
} int main(){
int n;
scanf("%d",&n); getchar();
for(int i = 1;i <= n;i++){
gets(MAP[i]);
}
int len = strlen(MAP[1]);
for(register int i = 1;i <= n;i++){
for(register int j = i + 1;j <= n;j++){
int sum = 0;
for(register int k = 0;k < len;k++){
if(MAP[i][k] != MAP[j][k]){
sum++;
if(sum > 2) break;
}
}
if(sum == 2) {
ma[i].pb(j);
ma[j].pb(i);
}
}
}
printf("%d\n",solve(n));
return 0;
}
D - Swap Free Gym - 102423D 二分图性质:补图最大团 = 点的个数 - 最大匹配数的更多相关文章
- poj 3041 Asteroids(二分图 *【矩阵实现】【最小点覆盖==最大匹配数】)
Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16379 Accepted: 8930 Descri ...
- BZOJ - 2744 朋友圈 (二分图上的最大团)
[题目大意] 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目.两 ...
- poj3041-Asteroids , 二分图的最小顶点覆盖数 = 最大匹配数
点击打开链接 Konig定理:二分图的最小顶点覆盖数 = 二分图的最大匹配数 题意: 在N*N的网络中有K颗小行星.小行星i的位置是(Ri, Ci).如今有一个强力的武器可以用一发光束将一整行或一整列 ...
- (hdu)2444 The Accomodation of Students 判断二分图+最大匹配数
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2444 Problem Description There are a group of s ...
- UVALive 2523 Machine Schedule(二分图求最大匹配数)
题意:有两台机器,上面有多个工作区域,有多个任务,分别可以在两台机器的某一个区域上完成,两台机器一开始都在0区域上工作,每次更改区域,都会重新启动一次,让我们求出最小的重启次数. 思路:将两个区域连线 ...
- 二分图匹配 最大匹配数+最大点覆盖 POJ 1469+POJ 3041
最大匹配数就等于最大点覆盖,因为在图里面,凡是要覆盖的点必定是连通的,而最大匹配之后,若还有点没有覆盖到,则必定有新的匹配,与最大匹配数矛盾,如果去掉一些匹配,则必定有点没有覆盖到. POJ 1469 ...
- POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 12439 Acce ...
- POJ1112 Team Them Up![二分图染色 补图 01背包]
Team Them Up! Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7608 Accepted: 2041 S ...
- E - Swap - hdu 2819(简单二分图匹配)
题意:如果可以交换行列,问主对角线能不能全为1 分析:要想主对角线全为1很明显要有N个行列不想同的点就行了,可以用二分图匹配计算出来多能有几个.如果小与N就不能.输出要是对的就行,不必和答案一样 ** ...
- [hdu5313]二分图性质,dp
题意:给定二分图,求添加的最多边数,使得添加之后还是二分图 思路:如果原图可以分成X,Y两个点集,那么边数最多为|X||Y|条.由于|X|+|Y|==n,所以需要使|X|与|Y|尽量接近.先对原图进行 ...
随机推荐
- 运维权限系统之 OpenLDAP(干货)
系统环境:CentOS7 一.OpenLDAP 1,开始安装(使用yum源码安装) yum install openldap openldap-servers openldap-clients ##拷 ...
- sudo: port: command not found 报错解决方案
mac本安装graphviz的方法是: sudo port install graphviz 执行报错: sudo: port: command not found 其实是未设置环境变量,执行下面的语 ...
- echo 操作
echo打印制表符到文件: MAP_PATH=/path/for i in `cat sp.list`; do echo -e "${MAP_PATH}/${i}.${i}/${i}.fin ...
- 关于decimal与double数据类型
关于double和decimal类型, double类型能表示的精度不如decimal,但是其数据范围比decimal的大. 对于double类型的字段,用sum函数会出现多位小数的情况,比如a+b+ ...
- Kafka的启动 并创建topic
一.进入到kafka的bin目录下,运行 ./kafka-server-start.sh -daemon /app/kafka/config/server.properties 注意:如果是0.9版本 ...
- ImmutablePair和ImmutableTriple的使用
场景 当我们调用某个方法,需要有超过一个值的返回时,我们通常会怎么做,比如现在需要调用方法返回姓名和年龄两个属性(假如姓名为张三,年龄为12). 方式一:使用Map,将Map中分别放入name为key ...
- font-awesome vue/react 通用的图标
在开发项目中遇到了矢量图标 一套绝佳的图标字体库和CSS框架 vue 中引入font-awesome 直接npm install font-awesome --save 就可以了,里边包含了样式和字体 ...
- Debug --> wireshark中的lua插件使用
一.使用Lua脚本对pcap文件按流进行存储 https://zhuanlan.zhihu.com/p/35188803 二.使用tshark对pcap报文进行批量切流 https://blog.cs ...
- C语言——使用循环和递归计算阶乘
使用循环和递归计算阶乘: /*使用循环和递归计算阶乘*/ #include<stdio.h> double fact(int num);//函数声明,阶乘函数,用于循环时调用 double ...
- excel制作表格
我们这个表格举例: 1. 序号列自动生成序号.选中数字"1"所在的单元格,将鼠标停留在图片中标红的区域向下拖动即可 ...