HDU4292 网络流

hdu4280(dinic+无向图) 这个数据真是卡的难受 一开始用kuangbin大大的板子 然后无向图正向反向都搞一个边和一个反边然后T掉了 看了看别人板子之后才发现原来无向图建边原来直接把反向边流量设置为和正边一样的流量就可以了 /* #include <map> #include <set> #include <cmath> #include <queue&g... 阅读详情

大致题意:

    有F种食物和D种饮料,每种食物或饮料只能供有限次,且每个人只享用一种食物和一种饮料。现在有n头牛,每个人都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几个人同时享用到自己喜欢的食物和饮料。

 

大致思路:

    把人给拆点,把食物和水的点放在人的两侧


求出s到t的网络流即可


非递归调用:

#include<cstdio>
#include<cstring>
using namespace std;
const int inf=1<<30;
const int nMax=100105;
const int mMax=3000005;
struct Node
{
	int c,u,v,next;
	void insert(int nu,int nv,int nc,int nnext)
	{
		u=nu;
		v=nv;
		c=nc;
		next=nnext;
	}
}edge[mMax];
int ne,head[nMax];
int cur[nMax],ps[nMax],dep[nMax];

void addedge(int u,int v,int w) //加边
{
	edge[ne].insert(u,v,w,head[u]);
	head[u]=ne++;
	edge[ne].insert(v,u,0,head[v]);
	head[v]=ne++;
}

int dinic(int s, int t){                       //  dinic
    int tr, res = 0;
    int i, j, k, f, r, top;
    while(1){
        memset(dep, -1, sizeof(dep));
        for(f = dep[ps[0]=s] = 0, r = 1; f != r;)
        {
            for(i = ps[f ++], j = head[i]; j; j = edge[j].next)
            {
                if(edge[j].c && dep[k=edge[j].v] == -1)
                {
                    dep[k] = dep[i] + 1;
                    ps[r ++] = k;
                    if(k == t)
                    {
                        f = r; break;
                    }
                }
            }
        }
        if(dep[t] == -1) break;
        memcpy(cur, head, sizeof(cur));
        i = s, top = 0;
        while(1)
        {
            if(i == t)
            {
                for(tr =inf, k = 0; k < top; k ++)
                {
                    if(edge[ps[k]].c < tr)
                    {
                        tr = edge[ps[f=k]].c;
                    }
                }
                for(k = 0; k < top; k ++)
                {
                    edge[ps[k]].c -= tr;
                    edge[ps[k]^1].c += tr;
                }
                i = edge[ps[top=f]].u;
                res += tr;
            }
            for(j = cur[i]; cur[i]; j = cur[i] =edge[cur[i]].next)
            {
                if(edge[j].c && dep[i]+1 == dep[edge[j].v])
                {
                	break;
                }
            }
            if(cur[i])
            {
                ps[top ++] = cur[i];
                i = edge[cur[i]].v;
            }
            else
            {
                if(top == 0)
                {
                	break;
                }
                dep[i] = -1;
                i = edge[ps[-- top]].u;
            }
        }
    }
    return res;
}

int main()
{
	int i,j,a,b,s,t,f,n,d;
	char str[205];
	while(~scanf("%d%d%d",&n,&f,&d))
	{
		s=0;
		t=f+n+d+10+n;
		ne=2;
		memset(head,0,sizeof(head));
		for(i=1;i<=f;i++)
		{
			scanf("%d",&a);
			addedge(s,i,a);
		}
		for(i=1;i<=d;i++)
		{
			scanf("%d",&a);
			addedge(f+n+n+i,t,a);
		}

		for(i=1;i<=n;i++)
		{
			addedge(f+i,f+n+i,1);
		}

		for(i=1;i<=n;i++)
		{
			scanf("%s",str);
			for(j=1;j<=f;j++)
			{
				if(str[j-1]=='Y')
				{
					addedge(j,f+i,inf);
				}
			}
		}
		for(i=1;i<=n;i++)
		{
			scanf("%s",str);
			for(j=1;j<=d;j++)
			{
				if(str[j-1]=='Y')
				{
					addedge(f+n+i,f+n+n+j,inf);
				}
			}
		}
		printf("%d\n",dinic(s,t));
	}
	return 0;
}



递归调用:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int n_max=10105;
const int m_max=300005;
const int inf=1<<30;

int s,t,num,adj[n_max],dis[n_max],q[n_max];
struct edge
{
	int v,w,pre;
	edge()
	{
		pre=0;
	}
	void insert(int vv,int ww,int ppre)
	{
		v=vv;
		w=ww;
		pre=ppre;
	}
}e[m_max];

void insert(int u,int v,int w)
{
	e[num].insert(v,w,adj[u]);
	adj[u]=num++;
	e[num].insert(u,0,adj[v]);
	adj[v]=num++;
}

bool bfs()
{
	int i,x,v,tail=0,head=0;
	memset(dis,0,sizeof(dis));
	dis[s]=1;
	q[tail++]=s;
	while(head<tail)
	{
		x=q[head++];
		for(i=adj[x];i!=-1;i=e[i].pre)
		{
			if(e[i].w&&dis[v=e[i].v]==0)
			{
				dis[v]=dis[x]+1;
				if(v==t)
				{
					return true;
				}
				q[tail++]=v;
			}
		}
	}
	return false;
}

int dfs(int s,int limit)
{
	if(s==t)
	{
		return limit;
	}
	int i,v,tmp,cost=0;
	for(i=adj[s];i!=-1;i=e[i].pre)
	{
		if(e[i].w&&dis[s]+1==dis[v=e[i].v])
		{
			tmp=dfs(v,min(limit-cost,e[i].w));
			if(tmp>0)
			{
				e[i].w-=tmp;
				e[i^1].w+=tmp;
				cost+=tmp;
				if(limit==cost)
				{
					break;
				}
			}
			else
			{
				dis[v]=-1;
			}
		}
	}
	return cost;
}

int Dinic()
{
	int ret=0;
	while(bfs())
	{
		ret+=dfs(s,inf);
	}
	return ret;
}

int main()
{
	int np,nf,nd,x;
	int i,j;
	char str[305];
	while(~scanf("%d%d%d",&np,&nf,&nd))
	{
		num=0;
		memset(adj,-1,sizeof(adj));
		s=nf+np+np+nd+1;
		t=s+1;
		for(i=1;i<=nf;i++)
		{
			scanf("%d",&x);
			insert(s,i,x);
		}
		for(i=1;i<=nd;i++)
		{
			scanf("%d",&x);
			insert(i+nf+np+np,t,x);
		}
		for(i=1;i<=np;i++)
		{
			insert(i+nf,i+nf+np,1);
		}
		for(i=1;i<=np;i++)
		{
			scanf("%s",str);
			for(j=1;j<=nf;j++)
			{
				if(str[j-1]=='Y')
				{
					insert(j,nf+i,inf);
				}
			}
		}
		for(i=1;i<=np;i++)
		{
			scanf("%s",str);
			for(j=1;j<=nd;j++)
			{
				if(str[j-1]=='Y')
				{
					insert(i+nf+np,j+nf+np+np,inf);
				}
			}
		}
		printf("%d\n",Dinic());
	}
	return 0;
}


Security Onion的部署(超详细) 本文介绍了开源入侵检测系统securityonion的部署 阅读详情

相关推荐

DID实战指南:从平行趋势检验到PSM-DID的Stata全流程解析

本文详细解析了双重差分法(DID)在政策评估中的应用,从平行趋势检验到PSM-DID的Stata全流程操作。通过实例演示和代码示例,帮助研究者掌握DID方法的核心逻辑、前提条件验证及稳健性检验技巧,提升因果推断研究的准确性。

weixin_29234239的博客 742

hdu4280 Island Transport(毒瘤卡常最大流)

  传送门 题意:n个岛屿有m个航道,每个航道能运送一定的人,问从最左端的岛屿到最右端的岛屿能运送的最大人流量 最大流裸题,但是这个N和M都是1e5的,dinic很容易被卡,如下图所示 这题10000ms,最后9999ms萌混过关(-ω- ) 过程就没什么好讲了,交就完事了,交个10发总有一发能A 逃走(o&gt;▽&lt;)   #pragma GCC optimi...

喵喵喵? 954

win10 运行lisflood_8踩过的坑

1、安装cuda及VS2019 https://www.bilibili.com/read/cv7335974/ 2、netcdf.h头文件找不到问题 https://www.cnblogs.com/lyggqm/p/12926974.html https://blog.youkuaiyun.com/u011954296/article/details/54617048 3、编码问题 https://blog.youkuaiyun.com/qq_33485434/article/details/81196843 4、

我的笔记 4115

Hdu4280 Island Transport(最大流卡时间)

题意: 给出一些点从最西边的点经过网络到最东边的点,问最大流量(无向图) 思路: 根据坐标找出最西边的点(源点)和最东边的点(汇点)。 建图也很直接, 无向图网络流,建边要正反向都要赋予流量值;如果有向图则正向流量值,反向为0。 卡时间。 Dinic用STL不行,都换成了数组。另外ISAP也行。 // 抛弃STL的Dinic , 7800ms #pragma comment(linker,"/ST...

CY05627的博客 251

Innovus Function ECO实战:5步搞定数字后端设计中的网表修正(含Calibre LVS验证技巧)

本文提供了一份完整的Innovus Function ECO实战指南,详细解析了数字后端设计中网表修正的五步流程。从理解Function ECO概念、准备关键文件,到在Innovus中执行逻辑比对、自动布线及GUI检查,并重点攻克了ECO后Calibre LVS验证的难点与调试技巧,帮助工程师高效、精准地完成流片前的设计微调。

day7的博客 950

C语言 函数

一、什么是函数 二、函数的相关语法 三、函数编码规范

m0_57105760的博客 1891

HDU 4280 Island Transport (最大流)

题意:给出n个点坐标,m条双向路线,每条路线给出一小时能运送的乘客数量,起点是最左边的点,终点是最右边的点,求一小时最大运客量。 题解:最大流 注意是双向路线,ISAP居然也卡,用了bfs初始化+栈优化才过。 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm&gt

gongyuandaye的博客 214

从理论到实践:Zemax驱动下的离轴三反光学系统全流程构建

本文详细阐述了从理论推导到软件实现的离轴三反光学系统全流程设计方法。文章首先分析了离轴三反系统在空间遥感等领域的优势,然后手把手指导如何基于像差理论计算共轴三反的初始结构参数,包括曲率半径与圆锥系数。最后,重点介绍了在Zemax中完成从共轴建模、视场离轴设置到优化与性能评估的完整实战步骤,为光学工程师提供了宝贵的经验与避坑指南。

weixin_29205061的博客 239

HDU 4280 Island Transport(网络流,最大流)

HDU 4280 Island Transport(网络流,最大流) Description In the vast waters far far away, there are many islands. People are living on the islands, and all the transport among the islands relies on the shi...

dipinzhu4111的博客 198

Agent Harness Engineering: AI Agent 执行管控与安全沙箱 原理与最佳实践

我们正站在计算范式转移的历史节点上。2024-2026 年间,AI 系统从被动的内容生成器(Generative AI)演变为主动的行动执行者(Agentic AI)。这一转变的根本特征是:根据 2026 年初的行业数据:然而,能力的提升伴随着风险的指数级增长。2024-2026 年间发生的多起标志性安全事件揭示了 Agent 系统的脆弱性:案例 1:Slack AI 数据外泄事件(2024 年 8 月)案例 2:制造业供应链攻击(2026 年 Q3)案例 3:Arup 深度诈骗案(2026 年 9 月)这

AI天才研究院 1670

手把手教你学Simulink--H桥逆变器的PWM控制设计与仿真

本文详细介绍了如何在Simulink环境中设计和仿真一个基于PWM控制的H桥逆变器。H桥逆变器广泛应用于电机驱动、UPS和可再生能源系统等领域,通过PWM技术可以有效控制输出电压的幅度和频率,减少谐波失真,提高系统效率和稳定性。文章首先介绍了所需的工具和环境,包括MATLAB/Simulink和SimscapeElectrical工具箱。接着,详细阐述了从定义任务需求、创建Simulink项目、建立基础电气模型、集成传感器模型、实现PWM控制算法到设置仿真参数和运行仿真的完整步骤。最后,文章总结了通过Sim

MHD0815的博客 720

HDU 4292 Food 图论,网络流,建模

HDU 4292 Food 图论,网络流,建模题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4292 或者 http://acm.hdu.edu.cn/showproblem.php?pid=4292// author:latstars // time:2016-09-02 19:23:27 // 题目:HDU 4292 // 分类:

latstars的博客 475

pytorch实现基本的logistic和softmax回归实验(手动+torch)

前提:不是前馈神经网络,没有隐藏层。 一:Logistic回归实验–人工构造数据集,手动构造模型 要求: 动手从0实现logistic回归,实现二分类,人工构造数据集,并分析loss、训练集、测试集的准确率。(要求从零实现二元交叉熵) 实验过程: 1.1人工构造数据集 1. # #自定义数据---训练集 2. num_inputs = 2 3. n_data = torch.ones(1500, num_inputs) # 数据的基本形态 4. x1 = torch.normal(2 * n_d

qq_37534947的博客 1万+

HDU 4292 Food (网络流,最大流)

HDU 4292 Food (网络流,最大流) Description You, a part-time dining service worker in your college’s dining hall, are now confused with a new problem: serve as many people as possible. The issue comes up...

dipinzhu4111的博客 207

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

HDU4292 网络流 2012 ACM/ICPC Asia Regional Chengdu Online1005

Food                                          Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)                                                             Total Submi

韩小侠的专栏 已迁移至lssea.com 1680

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

HDU 4292 FOOD 网络流

题目描述:Description   You, a part-time dining service worker in your college’s dining hall, are now confused with a new problem: serve as many people as possible.   The issue comes up as people in your

喵头鹰的博客 447

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

HDU 4292Food(网络流的最大流量)

职务地址:HDU 4292 水题。 因为每一个人仅仅能有1份,所以须要拆点限制流量。建图方法为,建一源点与汇点。将食物与源点相连,权值为食物额数量,将饮料与汇点相连,权值为饮料数量。。然后将人进行拆点为i和i‘,将相应的i与i’连边权值为1。将i与它所相应的YES的食物连边。将i‘与它所相应的YES的饮料连边。一次求最大流。 代码例如以下: #include &lt;iostrea...

weixin_33802505的博客 95

[hdu4292] Food [网络流]

题面: 传送门 思路: 又是一道网络流水题...... 这道题一眼看来不难,就是一个食物和水的二分图 但是问题来了 怎么做到每个人只拿一份食物一份水呢? 显然每个人分配一个点是不够的 那我们就要使用拆点的技巧,把一个人拆成两个点,中间连一条容量为1的边,这两个点再分别和食物、水相连 食物和源点连,水连到汇点,然后源汇最大流就是答案了、 Code: 1 #inc...

107

[HDU4292] Food 网络流

原题走这里意思大概就是有多种食品和饮料,每种个有若干个,每个人各有偏好,可能只喜欢某几种食品和饮料求如何每人分配一件食物和一件饮料,使得各人的偏好都被满足很容易就能想到网络流分层图网络流一开始我们可能会想到建三层图,食物一层,人一层,饮料一层源点向每一种食物连边,流量为该种食物的个数。类似的,饮料向汇点连边然后人和他所喜欢的食物和饮料连边,看上去是这样的然而无法限制每人只选一种食物和饮料为了限制人...

CRTorlonia的博客 296

hdu4292(网络流)

Food Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6741    Accepted Submission(s): 2279 Problem Description   You, a part-time di

yypurpose的博客 237

hdu4292网络流建图

题目大意: 有N个人, F种食物, D种饮料, 每种食物和饮料的数量有限且已经给出,每个人有自己喜欢的食物和饮料, 问,最多能满足多少人吃到自己喜欢的食物和饮料。建图的想法: 食物饮料数量有限,又要最大满足人数,想到网络流,将食物放到一边, 饮料放到另一边, 人放到中间,因为每个人只能吃一种食物和饮料,所以把人拆成两个点,不然同一个人就可能同时吃很多食物和饮料。 然后左边建一个超级源,右边建一个超级

ZHangFFYY的博客 422

Food HDU - 4292 (网络流)

  You, a part-time dining service worker in your college’s dining hall, are now confused with a new problem: serve as many people as possible.   The issue comes up as people in your college are more ...

PCCCCC的博客 168

HDU 4292网络流

//2012成都网赛E题 food 思路: 题目一看就知道是网络流啦。题目要求一个人既要得到一份喜欢的food有要有一份喜欢的drink,要处理其实也很简单,将一个人拆成两个点,如A,A‘,利用A‘来限流,假如food流到A的流量是3,我们连一条A到A’的边,边的权为1,这样就将流量限制成为1了。  网络流很多地方都可以多建立几个点。。。本菜太弱,建议弱友们可以在前期多多练习建图,至于算法 网上

work_freedom的专栏 495

HDU4292--Food拆点网络流

Food Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2132    Accepted Submission(s): 742 Problem Description   You, a part-time dining

crazy_石头的专栏 838

hdu 4292 网络流

网络流dinic()算法

cnh294141800的专栏 965

HDU 4292 Food 网络流模板

http://acm.hdu.edu.cn/showproblem.php?pid=4292 题解:网络流模板题 之前用的dinic模板加弧优化(不优化TLE)不如kuangbin模板快,网上找了另一个dinic不用队列快的更多   代码: kuangbin #include&lt;stdio.h&gt; #include&lt;string.h&gt; #include&lt;...

编程路漫漫 418
上一篇: HDU4289网络流
下一篇: hdu 4293 Groups
MakingMaker
博客等级 码龄15年 6粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值