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个格子不能相邻,并且取出的数的和最大. 初看: 没想法 ...
随机推荐
- 详解Webwork中Action 调用的方法
详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultAction ...
- UVALive 6449 IQ Test --高斯消元?
题意:给你一串数字,问这串数字符合f[n] = a*f[n-1],f[n] = a*f[n-1]+b*f[n-2],f[n] = a*f[n-1]+b*f[n-2]+c*f[n-3]这几个方程中的哪个 ...
- 两道相似KMP题
1.POJ 3450 Coporate Identity 这两题的解法都是枚举子串,然后匹配,像这种题目以后可以不用KMP来做,直接字符串自带的strstr函数搞定,如果字符串未出现,该函数返回NUL ...
- JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用
[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140877.html [正文] 一.ServletConfig:代表当前 ...
- Unity开发之NGUI系列
Unity插件收集 在Unity开发过程中会收集一些插件,收集这些插件的目的并不是我喜欢在开发中使用插件,而是本着喜欢的态度去收集的,就像我喜欢收集模型一样: 还有一点就是通过了解插件能让我知道Uni ...
- unix文件操作函数
1. fopen函数 #include <stdio.h> FILE *fopen(const char *path, const char *mode) 返回:文件顺利打开后,指向该流的 ...
- python将文件写成csv文件保存到本地
举个例子: import csv import os path='/tmp/' file='test.csv' def generate_csv(path,file): if not os.path. ...
- H5 canvas绘制出现模糊的问题
在之前做移动端小游戏幸运转盘.九宫格转盘,使用到了 canvas ,也是第一次在项目中使用 canvas 来实现. 近期测试人员反应 canvas 绘制的内容太模糊,心想着用 canvas 绘制出来的 ...
- extjs ajax请求与struts2进行交互
sencha extjs 5 增加一个struts2的配置,这样可以在设置好前台布局之后,与后台交互获取数据显示.现在有一个问题是struts2对于url的跳转action支 持比较良好,但是对于像E ...
- Java中的IO流系统详解(转载)
摘要: Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java ...