题意:有男孩和女孩,男孩之间全部认识,女孩之间全部认识,一部分男孩和女孩认识,现在希望选出一些孩子,这些孩子都相互认识。

方法:正的做不好做,观察他的补图,补图之间无关系的边就是原图有关系的。补图中的独立集不正是相互都没有连边么,反过来说,它们在原图中不正是两两都有连边么。

最小割:

#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 最大点权独立集/最大独立集的更多相关文章

  1. POJ3692 最大点权独立集元素个数

    题意:      n个男孩和m个女孩,给你他们谁和谁彼此了解,问你要找到一个集合,使得这个集合中的男孩和女孩相互了解,并且人数最多. 思路:      简单题目,其实就是在求最大点权独立集元素个数,先 ...

  2. HDU 1565 最大点权独立集

    首先要明白图论的几个定义: 点覆盖.最小点覆盖: 点覆盖集即一个点集,使得所有边至少有一个端点在集合里.或者说是“点” 覆盖了所有“边”.. 最小点覆盖(minimum vertex covering ...

  3. zoj 3165 (最小割,最大点权独立集)

    胡伯涛的<最小割模型在信息学竞赛中的应用>写的真牛. 这道题是选择一些男孩和女孩参加party,邀请的男孩女孩之间不能有 8g,图就是个明显的二分图,就是选择一些点之间没有8g关系,就是二 ...

  4. HDU1569 最大流(最大点权独立集)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  5. [学习笔记]最小割之最小点权覆盖&&最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  6. hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)

    转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形. 方格取数2解法 ...

  7. 【BZOJ-1952】城市规划 [坑题] 仙人掌DP + 最大点权独立集(改)

    1952: [Sdoi2010]城市规划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 73  Solved: 23[Submit][Status][ ...

  8. SCU3185 Black and white(二分图最大点权独立集)

    题目大概说有几个黑色.白色矩阵,问能选出黑白不相交的矩形面积和的最大值. 建二分图,黑色矩阵为X部的点,白色为Y部,XY的点权都为其矩阵面积,如果有个黑白矩阵相交则它们之间有一条边,那样问题就是要从这 ...

  9. 【最大点权独立集】【HDU1565】【方格取数】

    题目大意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. 初看: 没想法 ...

随机推荐

  1. IT技术团队管理-总结

    摘要:此文是书籍<行之有效:IT技术团队管理之道>的读书笔记. 主要是方便自己回顾. 您也可以通过此文简要了解此书的内容. 博客: http://www.cnblogs.com/jhzhu ...

  2. codeforces 712B B. Memory and Trident(水题)

    题目链接: B. Memory and Trident time limit per test 2 seconds memory limit per test 256 megabytes input ...

  3. python中的自测语句是什么?

    if __name__ == '__main__': main() 以上

  4. 使用appscan实现多站扫描简单自动化

    因为appscan在新建扫描任务的时候只能输入一个target,并且没有awvs/nessus那样提供web接口,导致我以前一直以为appscan不能像awvs那样批量建立任务自动扫描. 不过,今天要 ...

  5. .Net 项目代码风格要求小结

    代码风格没有正确与否,重要的是整齐划一,这是我拟的一份<.Net 项目代码风格要求>,供大家参考. 1. C# 代码风格要求1.1注释 类型.属性.事件.方法.方法参数,根据需要添加注释. ...

  6. 创建服务factory和service方法的区别

    factory方法返回的是对象,json或数组,也可以返回字符串类型的数据,但service方法只能返回数据或对象 创建服务有3种方法 $provide.provider('服务名',function ...

  7. ES6新增const常量、let变量

    JavaScript 严格模式(use strict) 严格模式下你不能使用未声明的变量. const c1 = 1; const c2 = {}; const c3 = []; 不能对c1的值进行再 ...

  8. Android开发EditText属性

    Android开发EditText属性 EditText继承关系:View-->TextView-->EditText EditText的属性很多,这里介绍几个:android:hint= ...

  9. 导航 tab

  10. 17Mybatis_动态sql-sql片段

    这篇文章讲一下sql片段. 讲一下sql片段的的需求: 将上边实现的动态sql判断代码块抽取出来,组成一个sql片段.其它的statement中就可以引用sql片段. 方便程序员进行开发. 第一步我们 ...