3081 题意:

n个女孩选择没有与自己吵过架的男孩有连边(自己的朋友也算,并查集处理),2分图,有些边,求有几种完美匹配(每次匹配每个点都不重复匹配)

我是建二分图后,每次增广一单位,(一次完美匹配),再修改起点还有终点的边流量,继续增广,直到达不到完美匹配为止。网上很多是用二分做的,我觉得没必要。。。(网上传播跟风真严重。。。很多人都不是真正懂最大流算法的。。。)

3277 :

再附加一条件,每个女孩可以最多与k个自己不喜欢的男孩。求有几种完美匹配(同上)。

我觉得:求出上题答案,直接ans+k即可(大于n取n),因为,最多是n种匹配。在限制的基础上,求出最大值,然后余下的k种,是随意连边的,总有完美匹配方案吧?当然不大于n,我是这样想的。不知道为什么WA。。。。感觉没问题。。。网上大多是拆点,连自己不喜欢的边,跑最大流(盲目跟风解法,不经思考的人很厌恶。。。吐槽几句:当我提出新解法的时候,有“牛”半秒内直接说显然错误。。然后又半天不解释。说:“二分+并查集+拆点+最大流,自己理解”....╮(╯▽╰)╭...呵呵)

3416: 求边不可重复最短路条数。比较简单。跑最短路后,类似dp找出是最短路的边,添加流量为1,直接最大流。

代码3081:

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<set>
#include<vector>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxv=210,maxe=40000;
int nume=0;int head[maxv];int e[maxe][3];
void inline adde(int i,int j,int c)
{
e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;
e[nume++][2]=c;
e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;
e[nume++][2]=0;
}
int ss,tt,n,m,fr;
int vis[maxv];int lev[maxv];
bool bfs()
{
for(int i=0;i<maxv;i++)
vis[i]=lev[i]=0;
queue<int>q;
q.push(ss);
vis[ss]=1;
while(!q.empty())
{
int cur=q.front();
q.pop();
for(int i=head[cur];i!=-1;i=e[i][1])
{
int v=e[i][0];
if(!vis[v]&&e[i][2]>0)
{
lev[v]=lev[cur]+1;
vis[v]=1;
q.push(v);
}
}
}
return vis[tt];
}
int dfs(int u,int minf)
{
if(u==tt||minf==0)return minf;
int sumf=0,f;
for(int i=head[u];i!=-1&&minf;i=e[i][1])
{
int v=e[i][0];
if(lev[v]==lev[u]+1&&e[i][2]>0)
{
f=dfs(v,minf<e[i][2]?minf:e[i][2]);
e[i][2]-=f;e[i^1][2]+=f;
sumf+=f;minf-=f;
}
}
if(!sumf) lev[u]=-1;
return sumf;
}
int dinic()
{
int sum=0;
while(bfs())sum+=dfs(ss,inf);
return sum;
};
int mapp[maxv][maxv];
int fa[maxv+1];
vector<set<int> >tos(maxv);
int find(int x)
{
if(x==fa[x])return x;
else fa[x]=find(fa[x]);
return fa[x];
}
void read_build()
{
int aa,bb;
for(int j=0;j<m;j++)
{
scanf("%d%d",&aa,&bb);
adde(aa,bb+n,1);
mapp[aa][bb]=1;
}
for(int i=0;i<fr;i++)
{
scanf("%d%d",&aa,&bb); int xx=find(aa);
int yy=find(bb);
if(xx!=yy)
{
fa[xx]=yy;
}
}
for(int i=1;i<=n;i++)
{
int tx=find(i);
for(int es=head[i];es!=-1;es=e[es][1])
{
if(es%2==0)
tos[tx].insert(e[es][0]-n);
}
}
for(int i=1;i<=n;i++)
{
int tx=find(i);
set<int>::iterator it=tos[tx].begin();
for(;it!=tos[tx].end();it++)
{
if(mapp[i][*it]==0)
{
mapp[i][*it]=1;
adde(i,(*it)+n,1);
}
}
}
for(int i=1;i<=n;i++)
{
adde(ss,i,1);
adde(i+n,tt,1);
}
/* for(int i=0;i<=tt;i++)
for(int j=head[i];j!=-1;j=e[j][1])
{
printf("%d->%d:%d\n",i,e[j][0],e[j][2]);
}*/
}
void init()
{
nume=0;
memset(mapp,0,sizeof(mapp));
ss=0;tt=2*n+1;
for(int i=0;i<maxv;i++)
{
head[i]=-1;fa[i]=i;tos[i].clear();
}
}
int main()
{
int T;
scanf("%d",&T);
for(int ii=1;ii<=T;ii++)
{
int tx;
scanf("%d%d%d",&n,&m,&fr);
init();
read_build();
int ans=0;
while(dinic()==n)
{
ans++;
for(int i=head[0];i!=-1;i=e[i][1])
{
e[i][2]=1;
e[i^1][2]=0;
}
for(int i=head[tt];i!=-1;i=e[i][1])
{
e[i^1][2]=1;
e[i][2]=0;
}
}
printf("%d\n",ans);
}
return 0;
}

hdu 3081 hdu 3277 hdu 3416 Marriage Match II III IV //最大流的灵活运用的更多相关文章

  1. hdu 3081 hdu 3277 hdu 3416 Marriage Match II III IV //灵活运用最大流量

    3081 意甲冠军: n女生选择不吵架,他甚至男孩边(他的朋友也算.并为您收集过程).2二分图,一些副作用,有几个追求完美搭配(每场比赛没有重复的每一个点的比赛) 后.每次增广一单位,(一次完美匹配) ...

  2. 【HDU3081】Marriage Match II (二分+最大流)

    Description Presumably, you all have known the question of stable marriage match. A girl will choose ...

  3. HDU 3081 Marriage Match II(二分法+最大流量)

    HDU 3081 Marriage Match II pid=3081" target="_blank" style="">题目链接 题意:n个 ...

  4. HDU 3416 Marriage Match IV (最短路径,网络流,最大流)

    HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...

  5. HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)

    HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...

  6. HDU 3081 Marriage Match II (二分图,并查集)

    HDU 3081 Marriage Match II (二分图,并查集) Description Presumably, you all have known the question of stab ...

  7. hdu 3416 Marriage Match IV (最短路+最大流)

    hdu 3416 Marriage Match IV Description Do not sincere non-interference. Like that show, now starvae ...

  8. HDU 3081 Marriage Match II 二分 + 网络流

    Marriage Match II 题意:有n个男生,n个女生,现在有 f 条男生女生是朋友的关系, 现在有 m 条女生女生是朋友的关系, 朋友的朋友是朋友,现在进行 k 轮游戏,每轮游戏都要男生和女 ...

  9. Marriage Match II(二分+并查集+最大流,好题)

    Marriage Match II http://acm.hdu.edu.cn/showproblem.php?pid=3081 Time Limit: 2000/1000 MS (Java/Othe ...

随机推荐

  1. cephfs 挂载 卸载

    #挂载 sudo ceph-fuse -m 10.1.xx.231:6789,10.1.xx.232:6789,10.1.xx.233:6789 -r /MySQL-BK /data/backup # ...

  2. 【Git版本控制】idea中使用git进行项目管理

    转载博文:完整教程-idea使用git进行项目管理(总结版)

  3. Oracle 数据库常用SQL语句(2)查询语句

    一.SQL基础查询 1.select语句 格式:select 字段 from 表名; 2.where 用于限制查询的结果. 3.查询条件 > < >= <= = != 4.与 ...

  4. 科学计算库Numpy——numpy.ndarray

    创建ndarray 元素类型 对于ndarray结构来说,里面所有的元素必须是同一类型的,如果不是的话,会自动的向下进行转换. 元素类型所占字节数 数组维数 元素个数 数组的维度 数组中填充固定值 索 ...

  5. LeetCode(151) Reverse Words in a String

    题目 Given an input string, reverse the string word by word. For example, Given s = "the sky is b ...

  6. npm 安装express npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE

    npm安装总是报错 报错信息: 解决方案: 在命令行输入: npm config set strict-ssl false 设置之后即可安装软件:

  7. python面试题解析(前端、框架和其他)

    答: HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  8. Xampp 配置出现403无法访问

    找到\xampp\apache\conf\httpd.conf配置文件 Access forbidden! You don’t have permission to access the reques ...

  9. tomcat6-输入输出buffer设计

    之前写的一个ppt 搬到博客来

  10. STW Family

    序言 一次作业致使我们成为了一个团体,相聚即是缘分,让我们一起为STW绘制一幅完美的画卷,交一份满意的答卷. 这不是一个人的王者,是团队的荣耀. Team成员 队长:王筱哲 201631062220 ...