poj3692 最大点权独立集/最大独立集
题意:有男孩和女孩,男孩之间全部认识,女孩之间全部认识,一部分男孩和女孩认识,现在希望选出一些孩子,这些孩子都相互认识。
方法:正的做不好做,观察他的补图,补图之间无关系的边就是原图有关系的。补图中的独立集不正是相互都没有连边么,反过来说,它们在原图中不正是两两都有连边么。
最小割:
#include<stdio.h>
#include<string.h>
#include<queue>
#define INF 99999999
using namespace std;
const int maxn = ;
struct node
{
int to;
int v;
int flag;
int next;
}edge[*];
int pre[maxn],index,vis[maxn],S,T,map[maxn][maxn];
void add(int x,int y,int z)
{
edge[index].to=y;
edge[index].v=z;
edge[index].flag=index+;
edge[index].next=pre[x];
pre[x]=index++;
edge[index].to=x;
edge[index].v=;
edge[index].flag=index-;
edge[index].next=pre[y];
pre[y]=index++;
}
int dfs(int u,int low)
{
int i,used=;
if(u==T)
return low;
for(i=pre[u];i!=-&&used<low;i=edge[i].next)
{
if(vis[edge[i].to]==vis[u]+&&edge[i].v)
{
int a=dfs(edge[i].to,min(low-used,edge[i].v));
edge[i].v-=a;
edge[edge[i].flag].v+=a;
used+=a;
}
}
if(!used)
vis[u]=-;
return used;
}
int BFS()
{
int i;
queue<int>q;
memset(vis,-,sizeof(vis));
vis[]=;
q.push();
while(!q.empty())
{
int t=q.front();
q.pop();
for(i=pre[t];i!=-;i=edge[i].next)
{
if(vis[edge[i].to]<&&edge[i].v)
{
vis[edge[i].to]=vis[t]+;
q.push(edge[i].to);
}
}
}
if(vis[T]>)
return ;
return ;
}
int main()
{
int i,j,n,m,k,ft=;
while(~scanf("%d%d%d",&n,&m,&k))
{
if(!n&&!m&&!k)
break;
memset(map,,sizeof(map));
memset(pre,-,sizeof(pre));
index=;
S=,T=n+m+;
for(i=;i<=n;i++)
{
add(,i,);
for(j=;j<=n;j++)
{
if(i==j)continue;
map[i][j]=;
}
}
for(i=;i<=m;i++)
{
add(i+n,T,);
for(j=;j<=m;j++)
{
if(i==j)continue;
map[i+n][j+n]=;
}
}
for(i=;i<k;i++)
{
int x,y;
scanf("%d%d",&x,&y);
map[x][y+n]=;
}
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
if(!map[i][j+n])
add(i,j+n,INF);
}
}
int ans=;
while(BFS())
{
while()
{
int a=dfs(,INF);
if(!a)break;
ans+=a;
}
//printf("1");
}
printf("Case %d: %d\n",++ft,n+m-ans);
}
}
二分匹配:
#include<stdio.h>
#include<string.h>
#include<queue>
#define INF 99999999
using namespace std;
const int maxn = ;
int match[maxn],vis[maxn],map[maxn][maxn];
int dfs(int u,int m)
{
int i,j;
for(i=;i<=m;i++)
{
if(!vis[i]&&!map[u][i])
{
vis[i]=;
if(match[i]==-||dfs(match[i],m))
{
match[i]=u;
return ;
}
}
}
return ;
}
int main()
{
int i,j,n,m,k,ft=;
while(~scanf("%d%d%d",&n,&m,&k))
{
if(!n&&!m&&!k)
break;
memset(match,-,sizeof(match));
memset(map,,sizeof(map));
for(i=;i<k;i++)
{
int x,y;
scanf("%d%d",&x,&y);
map[x][y]=;
}
int ans=;
for(i=;i<=n;i++)
{
memset(vis,,sizeof(vis));
if(dfs(i,m))
ans++;
}
printf("Case %d: %d\n",++ft,n+m-ans);
}
}
poj3692 最大点权独立集/最大独立集的更多相关文章
- POJ3692 最大点权独立集元素个数
题意: n个男孩和m个女孩,给你他们谁和谁彼此了解,问你要找到一个集合,使得这个集合中的男孩和女孩相互了解,并且人数最多. 思路: 简单题目,其实就是在求最大点权独立集元素个数,先 ...
- HDU 1565 最大点权独立集
首先要明白图论的几个定义: 点覆盖.最小点覆盖: 点覆盖集即一个点集,使得所有边至少有一个端点在集合里.或者说是“点” 覆盖了所有“边”.. 最小点覆盖(minimum vertex covering ...
- zoj 3165 (最小割,最大点权独立集)
胡伯涛的<最小割模型在信息学竞赛中的应用>写的真牛. 这道题是选择一些男孩和女孩参加party,邀请的男孩女孩之间不能有 8g,图就是个明显的二分图,就是选择一些点之间没有8g关系,就是二 ...
- HDU1569 最大流(最大点权独立集)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- [学习笔记]最小割之最小点权覆盖&&最大点权独立集
最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...
- hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)
转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形. 方格取数2解法 ...
- 【BZOJ-1952】城市规划 [坑题] 仙人掌DP + 最大点权独立集(改)
1952: [Sdoi2010]城市规划 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 73 Solved: 23[Submit][Status][ ...
- SCU3185 Black and white(二分图最大点权独立集)
题目大概说有几个黑色.白色矩阵,问能选出黑白不相交的矩形面积和的最大值. 建二分图,黑色矩阵为X部的点,白色为Y部,XY的点权都为其矩阵面积,如果有个黑白矩阵相交则它们之间有一条边,那样问题就是要从这 ...
- 【最大点权独立集】【HDU1565】【方格取数】
题目大意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. 初看: 没想法 ...
随机推荐
- HDU 5083 Instruction --模拟
题意:给出汇编指令,解释出编码或者给出编码,解释出汇编指令. 解法:简单模拟,按照给出的规则一步一步来就好了,主要是注意“SET”的情况,还有要输出的东西最好放到最后一起输出,中间如果一旦不对就可以及 ...
- javascript编程习惯总结
总结一下javascript需要注意的一些细节的地方: 1:声明一个对象:var a={ }; 2:另一个对象继承一个对象:Var b=Object.create(a);如果父类的属性和方法发生改变, ...
- android图片缩小和放大Matrix
/**Bitmap放大的方法*/ private static Bitmap big(Bitmap bitmap) { Matrix matrix = new Matrix(); matrix.pos ...
- Android 屏幕适配(二)增强版百分比布局库(percent-support-lib)
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46767825: 本文出自:[张鸿洋的博客] 一 概述 上周一我们发布了Andr ...
- Hibernate入门注解笔记
@Entity 代表实体 映射一张表 @Table 定义表的属性 @Embeddable 定义类级别可以被嵌入 @Id 指定主键 @GeneratedValue 指定主键生成策略 @Column指定列 ...
- 工厂模式(Factory Patter)
1.工厂模式简介 工厂模式属于创建型模式,是专门用来创建对象的模式,抽象了实例化的过程.工厂模式分为 : 工厂方法模式.抽象工厂模式. 在学习工厂方法模式.抽象工厂之前,首先先要了解一下简单工厂模式, ...
- 构建Docker+Jenkins持续集成环境
docker和Jenkins不是什么新东西了,两者结合也不是什么稀奇的事情,也已经有很多Jenkins和docker相结合的文章,此文仅为自己的一点心得实践,如有不对的地方,欢迎大家纠正. 先贴上大致 ...
- High Performance Animations
http://www.html5rocks.com/zh/tutorials/speed/high-performance-animations/
- win7(X64)+VS2013+OpenCV3.1环境配置
&1 源文件 VS2013: 链接:http://pan.baidu.com/s/1o8EKQq2 密码:open OpenCV3.1: 链接:http://pan.baidu.com/s/ ...
- IOS开发之——Masonry 只支持OC,暂不支持swift
前言 1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时 ...