题目大意:n个人,分为两个阵营。现在要组成由若干支队伍,每支队伍由两个人组成并且这两个人必须来自不同的阵营。同时,每个人都有m个厌恶的对象,并且厌恶是相互的。相互厌恶的人不能组成一支队伍。问最多能组成多少支队伍,并在在队伍数最多的前提下求最多的女生数以及输出方案。

题目分析:很显然是个二分图。从阵营1的每个元素向阵营0的每个元素连一条有向边(互相厌恶的不连),这就得到一张二分图。给每条边一个权值,边两端的女生越多,权值越大。只需要求最大完美匹配即可。

ps:比赛的时候连边只连了一半儿,导致一直wa。。。

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<vector>
# include<queue>
# include<list>
# include<set>
# include<map>
# include<string>
# include<cmath>
# include<cstdlib>
# include<algorithm>
using namespace std;
# define LL long long const int N=1005;
const int INF=1000000000;
const LL oo=0x7fffffffffffffff;
const double eps=1e-10; int n;
int mp[N/2+5][N/2+5];
int slack[N/2+5];
int link[N/2+5];
int lx[N/2+5];
int ly[N/2+5];
int s[N/2+5],t[N/2+5];
int vis[N/2+5][N/2+5];
string p,q; bool match(int x)
{
s[x]=1;
for(int y=0;y<n;++y){
if(t[y]) continue;
int temp=lx[x]+ly[y]-mp[x][y];
if(temp==0){
t[y]=1;
if(link[y]==-1||match(link[y])){
link[y]=x;
return true;
}
}else if(slack[y]>temp)
slack[y]=temp;
}
return false;
} void update()
{
int d=INF;
for(int i=0;i<n;++i) if(!t[i])
d=min(d,slack[i]);
for(int i=0;i<n;++i) if(s[i]) lx[i]-=d;
for(int i=0;i<n;++i){
if(t[i]) ly[i]+=d;
else slack[i]-=d;
}
} void KM()
{
memset(link,-1,sizeof(link));
memset(ly,0,sizeof(ly));
for(int i=0;i<n;++i){
lx[i]=-1;
for(int j=0;j<n;++j)
lx[i]=max(lx[i],mp[i][j]);
}
for(int i=0;i<n;++i){
fill(slack,slack+n,INF);
while(true){
memset(s,0,sizeof(s));
memset(t,0,sizeof(t));
if(match(i))
break;
update();
}
}
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
cin>>p>>q;
memset(mp,0,sizeof(mp));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;++i){
int k;
scanf("%d",&k);
while(k--){
int a;
scanf("%d",&a);
vis[i][a-1]=vis[a-1][i]=1;
}
for(int j=0;j<n;++j){
if(i==j||p[i]==p[j]||vis[i][j]||vis[j][i]) continue;
int gg=1; ///这里如果为gg=0会wa
if(q[i]=='0') ++gg;
if(q[j]=='0') ++gg;
if(p[i]=='1'&&p[j]=='0') mp[i][j]=gg;
else if(p[i]=='0'&&p[j]=='1') mp[j][i]=gg;
}
}
KM();
int ansa=0,ansb=0;
for(int i=0;i<n;++i) if(link[i]!=-1&&mp[link[i]][i]){
++ansa;
if(q[link[i]]=='0') ++ansb;
if(q[i]=='0') ++ansb;
}
printf("%d %d\n",ansa,ansb);
for(int i=0;i<n;++i) if(link[i]!=-1&&mp[link[i]][i])
printf("%d %d\n",link[i]+1,i+1);
}
return 0;
}

  

ZOJ-3933 Team Formation (二分图最佳完美匹配)的更多相关文章

  1. UVa1349 Optimal Bus Route Design(二分图最佳完美匹配)

    UVA - 1349 Optimal Bus Route Design Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...

  2. UVa 11383 少林决胜(二分图最佳完美匹配)

    https://vjudge.net/problem/UVA-11383 题意: 给定一个N×N矩阵,每个格子里都有一个正整数W(i,j).你的任务是给每行确定一个整数row(i),每列也确定一个整数 ...

  3. Ants(二分图最佳完美匹配)

    Ants Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6904   Accepted: 2164   Special Ju ...

  4. UVA - 1045 The Great Wall Game(二分图最佳完美匹配)

    题目大意:给出棋盘上的N个点的位置.如今问将这些点排成一行或者一列.或者对角线的最小移动步数(每一个点都仅仅能上下左右移动.一次移动一个) 解题思路:暴力+二分图最佳完美匹配 #include < ...

  5. 【LA4043 训练指南】蚂蚁 【二分图最佳完美匹配,费用流】

    题意 给出n个白点和n个黑点的坐标,要求用n条不相交的线段把他们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接一条线段. 分析 结点分黑白,很容易想到二分图.其中每个白点对应一个X结 ...

  6. Uva1349Optimal Bus Route Design(二分图最佳完美匹配)(最小值)

    题意: 给定n个点的有向图问,问能不能找到若干个环,让所有点都在环中,且让权值最小,KM算法求最佳完美匹配,只不过是最小值,所以把边权变成负值,输出时将ans取负即可 这道题是在VJ上交的 #incl ...

  7. UVa 1349 - Optimal Bus Route Design(二分图最佳完美匹配)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. 【LA2238 训练指南】固定分区内存管理 【二分图最佳完美匹配,费用流】

    题意 早期的多程序操作系统常把所有的可用内存划分为一些大小固定的区域,不同的区域一般大小不同,而所有区域的大小之和为可用内存的大小.给定一些程序,操作系统需要给每个程序分配一个区域,使得他们可以同时执 ...

  9. HDU_2255 二分图最佳完美匹配 KM匈牙利算法

    一开始还没看懂这个算法,后来看了陶叔去年的PPT的实例演示才弄懂 用一个lx[]和ly[]来记录X和Y集合中点的权值,有个定理是 lx[i]+ly[j]==w[i][j](边权值) 则该点是最佳匹配, ...

随机推荐

  1. viewController的自动扩展属性导致TableViewGroupStyle时向上填充

    self.automaticallyAdjustsScrollViewInsets = NO; 需设置这个属性

  2. Java面向对象的三大特征

    Java面向对象的三大特征 java面向对象的三大特征:“封装.继承.多态”.更多Java技术知识,请登陆疯狂软件教育官网.微信搜索微信号:疯狂软件,参加2015年优惠活动,有机会获得优惠劵和代金劵. ...

  3. 操作系统:cpu调度 6-25

    1. 进程选择 1小时和1分钟? 进程优先1分钟,再执行1小时. 时间短的进程先执行,执行顺序也有关. 2. 遇到io操作,执行的进程先让出cpu,切换其他进程. 3.进程先来先服务,进程调度策略: ...

  4. C语言:typedef 跟 define 的区别

    typedef (int*) pINT1;以及下面这行:#define pINT2 int* pINT1 a,b; 与pINT2 a,b; 定义的a,b 有差别吗 回答: typedef作为类型定义关 ...

  5. vijos 1907 飞扬的小鸟

    我心里毫无波动甚至还有点想笑. WTF WTF WTF WTF WTF WTF WTF GTMD调了一天什么鬼啊. 原来更新的范围有讲究啊. #include<iostream> #inc ...

  6. 如何解决火狐FF里Input标签刷新页面后 仍然保存之前输入的内容的方法。

    直接在input 标签里 增加 autocomplete="off".火狐默认为 on.

  7. oracle 修改字段类型的方法(转)

    今天公司因为业务需要,修要修改某个字段数据类型有number(5),变为number(5,2)型 要是没有数据的话直接用以下语句即可 alter   table  tb_test  modify pe ...

  8. SQL基础,与数据类型;

    net start mssqlserver 开启数据库:  net stop mssqlserver 关闭数据库:  net pause mssqlserver 暂停数据库:  net continu ...

  9. Magento后台订单显示产品图片的修改方法

    Magento后台订单原来是没有显示产品图片,客服业务还得到网站前台查找这个产品的图片提供给发货部,这样是很不方便的.为提高工作效率,应客服业务要求,现对Magento后台订单进行修改,使订单页面就显 ...

  10. lstm的debug模式下编译不行貌似

    待验证,因为也可能是 USE_CUDNN := 1被注释掉的原因