hdu 3081 hdu 3277 hdu 3416 Marriage Match II III IV //灵活运用最大流量
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 //灵活运用最大流量的更多相关文章
- hdu 3081 hdu 3277 hdu 3416 Marriage Match II III IV //最大流的灵活运用
3081 题意: n个女孩选择没有与自己吵过架的男孩有连边(自己的朋友也算,并查集处理),2分图,有些边,求有几种完美匹配(每次匹配每个点都不重复匹配) 我是建二分图后,每次增广一单位,(一次完美匹配 ...
- HDU 3081 Marriage Match II(二分法+最大流量)
HDU 3081 Marriage Match II pid=3081" target="_blank" style="">题目链接 题意:n个 ...
- HDU 3416 Marriage Match IV (最短路径,网络流,最大流)
HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...
- HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)
HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...
- HDU 3081 Marriage Match II (二分图,并查集)
HDU 3081 Marriage Match II (二分图,并查集) Description Presumably, you all have known the question of stab ...
- hdu 3416 Marriage Match IV (最短路+最大流)
hdu 3416 Marriage Match IV Description Do not sincere non-interference. Like that show, now starvae ...
- HDU 3081 Marriage Match II 二分 + 网络流
Marriage Match II 题意:有n个男生,n个女生,现在有 f 条男生女生是朋友的关系, 现在有 m 条女生女生是朋友的关系, 朋友的朋友是朋友,现在进行 k 轮游戏,每轮游戏都要男生和女 ...
- Marriage Match II(二分+并查集+最大流,好题)
Marriage Match II http://acm.hdu.edu.cn/showproblem.php?pid=3081 Time Limit: 2000/1000 MS (Java/Othe ...
- HDU3081:Marriage Match II (Floyd/并查集+二分图匹配/最大流(+二分))
Marriage Match II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- HTML4和HTML5之间10主要差异
HTML5恐怕要让部分网页工作者抓狂了,HTML5将採用标准的XML语法格式,这对代码的规范要求很高. HTML5是最新的HTML标准.尽管还在制定.但或迟或早,全部的web程序猿都会发现须要使用到这 ...
- adt-bundle-windows-x86_32-20140702
adt-bundle-windows-x86_32-20140702 Windows > Preference,在Android里没有NDK选项 法一:help->install new ...
- 21天教你学会C++
- WPF命中测试示例(二)——几何区域命中测试
原文:WPF命中测试示例(二)--几何区域命中测试 接续上次的命中测试,这次来做几何区域测试示例. 示例 首先新建一个WPF项目,在主界面中拖入一个按钮控件,并修改代码中的以下高亮位置: 当前设计视图 ...
- Linux应用环境实战05:在Ubuntu 14.10中借用Windows的字体 (转)
阅读目录 设置系统字体 安装微软的英文字体 查看系统的配置文件 借用Windows的字体 编写配置文件 在前一篇随笔中,我详细讨论了字体的分类及用途,也以Fedora 20为例,展示了字体配置的思路和 ...
- Microsoft Build 2016 Day 2
Microsoft Build 2016 Day 2 Microsoft Build 2016 Day 1 记录 Microsoft Build 2016 进行到了第二天,我觉得这一天的内容非常精彩, ...
- hdu1513 (滚动数据压缩空间)
给定一个字符串,问最少添加多少个字符可以使得这个字符串变成回文串 if(str[i]==str[j]) dp[i][j] = dp[i+1][j-1] else dp[i][j] = min(dp[i ...
- PB数据库相关
---------------------------------------------------------------- 数据库画板: 一张表定义了主键或者唯一索引,则能够在Results视窗 ...
- 上传App时遇IDFA错误问题
今天上传App时遇到下图1的情况,很纳闷,又是苹果新规. 通常是第三方的库引起啦,马上想到百度统计了,打开SDK下载页面看看简单介绍,里面有讲到这个问题了. 图2就是这次改动的原因. 更新SDK,之前 ...
- OpenStack Dashboard
OpenStackDashboard 为管理员和普通用户提供了一个图形化管理界面.用户能够通过该界面訪问.分配或者自己主动化分配基于云的资源.可扩展的设计使得与第三方产品和服务融合变得非常easy,比 ...