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. Windows 10+Ubuntu双系统修复Ubuntu启动引导

    U盘启动,联网 $ sudo su sudo add-apt add-apt-repository ppa:yannubuntu/boot-repair apt-get update apt-get ...

  2. python中字符串的一些用法

    一.字符串的拼接:      a=‘123’      b=‘abc’       d=‘hello world’ 1.print(a+b) 2.print(a,b) 3. c=‘ ’.join((a ...

  3. and和or运算

    and和or的运算,从前向后按顺序计算,当True结果遇到or就停止,返回True:当False结果遇到and就停止,返回False:False遇到or,继续走:True遇到and,继续走. > ...

  4. Linux下的硬件驱动——USB设备(转载)

    usb_bulk_msg函数 当对usb设备进行一次读或者写时,usb_bulk_msg 函数是非常有用的; 然而, 当你需要连续地对设备进行读/写时,建议你建立一个自己的urbs,同时将urbs 提 ...

  5. POJ2239二分匹配

    开始以为是最长路,想着把每一门课程的每一节课时作为一个点去建有向图...然后写的时候发现点太多了(300*7*12)建图特麻烦,就果断放弃了这个思路. 然后开始用排除法来想用什么算法合适,没环不可能缩 ...

  6. SpringBoot接收前端参数的三种方法

    都是以前的笔记了,有时间就整理出来了,SpringBoot接收前端参数的三种方法,首先第一种代码: @RestController public class ControllerTest { //访问 ...

  7. Leetcode13--->罗马数字转换为整数

    该算法是将罗马数字转换为整数,思路如下:比如IXX,使用临时变量temp保存上一个已经遍历的罗马数字,比如:遍历时是从后往前遍历的:1> 刚开始时,temp = 0; 遍历当前遍历到第一个X,则 ...

  8. 大数据学习——KETTLE入门学习——kettle安装

    https://blog.csdn.net/u012637358/article/details/82593492 下载的kettle是汉化的 改成英文的 工具——选项——选择英文

  9. python - 接口自动化 - 接口测试基础知识

    # -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: study_接口测试基础知识一.py@ide: PyCharm Commun ...

  10. POJ 2353 Ministry

    Ministry Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4220   Accepted: 1348   Specia ...