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. HDU 3081 Marriage Match II(二分法+最大流量)

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. HDU3081:Marriage Match II (Floyd/并查集+二分图匹配/最大流(+二分))

    Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. jquery autocomplete ajax获取动态数据,兼容各浏览器,支持中文

    jquery.autocomplete.js经过改动,支持各种浏览器.支持中文输入! 1.效果图例如以下 2.HTML和ajax代码 <!DOCTYPE html> <html xm ...

  2. 大并发连接的oracle在Linux下内存不足的问题的分析(转)

    最近一台装有Rhel5.3的40G内存的机器上有一个oracle数据库,数据库的SGA设置为20G,当运行业务时,一个业务高峰期时,发现swap频繁交换,CPU 100%,Load很高,基本体现为内存 ...

  3. Swift难点-继承中的构造规则实例具体解释

    关于继承中的构造规则是一个难点. 假设有问题,请留言问我. 我的Swift新手教程专栏 http://blog.csdn.net/column/details/swfitexperience.html ...

  4. HDU ACM 2845 Beans-&gt;动态规划

    意甲冠军: 1. 对于每一行是,对不相邻的同一时间数取: 2.它是相同的列,相邻行不能同时服用: 3.因此,我们可以得到状态方程:dp[i]=dp[i-1]>(dp[i-2]+a[i])?dp[ ...

  5. hdu2242(树形dp+tarjan+缩点)

    hdu2242 http://acm.hdu.edu.cn/showproblem.php?pid=2242 给定n,m表示n个点,m条边 每个点有个权值 问我们删除两某条边(割边)后将图分为两个部分 ...

  6. hdu - 5045 - Contest(国家压缩dp)

    意甲冠军:N个人M通过主打歌有自己的期望,每个问题发送人玩.它不能超过随机播放的次数1,追求最大业绩预期 (1 ≤ N ≤ 10,1 ≤ M ≤ 1000). 主题链接:pid=5045" ...

  7. Net 高效开发

    Net 高效开发之不可错过的实用工具   工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为各ASP.NET 开发者介绍一些高效实用的工具,涉及SQL 管理,VS插件,内存 ...

  8. 重新想象 Windows 8 Store Apps (5) - 控件之集合控件: ComboBox, ListBox, FlipView, ItemsControl, ItemsPresenter

    原文:重新想象 Windows 8 Store Apps (5) - 控件之集合控件: ComboBox, ListBox, FlipView, ItemsControl, ItemsPresente ...

  9. play framework2.5.

    play framework2 的学习笔记 https://github.com/playframework/playframework https://github.com/playframewor ...

  10. 【v2.x OGE课程 14】 控制使用

    在这里,精灵.动画精灵.button天才.经常使用的文本的使用 一个.相关精灵 1.加入精灵 //创建精灵 Sprite bar_up = new Sprite(400, 0, RegionRes.g ...