首页 > 其他分享 >2024-04-06

2024-04-06

时间:2024-04-06 21:33:21浏览次数:19  
标签:06 04 idx int 2024 dep 割掉 hd edg

2024-04-06

太空飞行计划问题

最小割模型

源点向实验连边,容量是收益
仪器向汇点连边,容量是花费

割掉一条边,代表放弃实验/购买仪器
合法的情况就是源点汇点不连通,代表要么买了仪器,要么用到这台仪器的所有实验都放弃

记录总收益为 sum,最小割为 res

\(ans=sum-res\)

(这题读入特别恶心)

切糕

没有 \(D\) 的限制的直接建 \(Z+1\) 层
第 \(k\) 层的一个位置 \((i,j)\) 向 \(k+1\) 层的这个位置连 \(\nu(i,j,k)\) 的边
如果割掉代表这个位置在这个点切开
源点向第一层连边,最后一层向汇点连边,便全都为正无穷
目的是切成两半,也就是切到源汇不连通,要求代价最小,直接最小割模板

考虑 \(D\) 的限制
若两个位置 \((x_1,y_1)\) 和 \((x_2,y_2)\) 相邻
我们从 \((x_1,y_1,z)\) 向 \((x_2,y_2,z-D)\) 连一条正无穷的边
这样的话
如果点 \((x,y,z)\) 往上边一层连的边被割掉了,由于还有相邻位置之间的边,源汇还是连通的,想要不连通,就要在相邻的位置在 \(z-D\) 之上割掉某一条边
如果我们在相邻位置割掉的是 \(z+D\) 之上的,那么在 \((x,y)\) 这个位置就还要再割边,这样一定不是最优秀的,所以最小割因为下面那条割掉的边就可以加回来了

这个技巧看起来很有用的样子,不知道之后还会不会用到,先记下来再说

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue> 

using namespace std;

const int N=66666,M=666666;
const int Inf=1e8;

const int dx[4]={-1,0,0,1};
const int dy[4]={0,-1,1,0};

int X,Y,Z,D;
int s,t;

int hd[N],edg[M],cap[M],nxt[M],idx;
int dep[N],cur[N];

void adde(int u,int v,int w) {
	edg[idx]=v,cap[idx]=w,nxt[idx]=hd[u],hd[u]=idx++;
	edg[idx]=u,cap[idx]=0,nxt[idx]=hd[v],hd[v]=idx++;
}

bool bfs() {
	queue<int> q;
	memset(dep,-1,sizeof(dep));
	dep[s]=0,cur[s]=hd[s];
	q.push(s);
	while(!q.empty()) {
		int u=q.front();
		q.pop();
		for(int i=hd[u];~i;i=nxt[i]) {
			int v=edg[i];
			if(dep[v]==-1&&cap[i]) {
				dep[v]=dep[u]+1;
				cur[v]=hd[v];
				if(v==t) return true;
				q.push(v);
			}
		}
	}
	return false;
}

int dfs(int u,int lim) {
	if(u==t) return lim;
	int flw=0;
	for(int i=cur[u];~i&&flw<lim;i=nxt[i]) {
		cur[u]=i;
		int v=edg[i];
		if(dep[v]==dep[u]+1&&cap[i]) {
			int tmp=dfs(v,min(cap[i],lim-flw));
			if(!tmp) dep[v]=-1;
			cap[i]-=tmp,cap[i^1]+=tmp;
			flw+=tmp;
		}
	}
	return flw;
}

int dinic() {
	int res=0,flw;
	while(bfs()) while(flw=dfs(s,Inf)) res+=flw;
	return res;
}

int getid(int x,int y,int z) {
	return ((x-1)*Y+y-1)*Z+z;
}

int main() {
	memset(hd,-1,sizeof(hd));
	scanf("%d%d%d%d",&X,&Y,&Z,&D);
	Z++;
	s=0,t=X*Y*Z+1;
	for(int k=1;k<Z;k++) {
		for(int i=1;i<=X;i++) {
			for(int j=1;j<=Y;j++) {
				int w;
				scanf("%d",&w);
				adde(getid(i,j,k),getid(i,j,k+1),w);
			}
		}
	}
	for(int i=1;i<=X;i++) {
		for(int j=1;j<=Y;j++) {
			adde(s,getid(i,j,1),Inf);
			adde(getid(i,j,Z),t,Inf);
		}
	}
	for(int x1=1;x1<=X;x1++) {
		for(int y1=1;y1<=Y;y1++) {
			for(int dr=0;dr<4;dr++) {
				int x2=x1+dx[dr],y2=y1+dy[dr];
				if(x2<1||x2>X||y2<1||y2>Y) continue;
				for(int k=D+1;k<Z;k++)
					adde(getid(x1,y1,k),getid(x2,y2,k-D),Inf);
			}
		}
	}
	printf("%d\n",dinic());
	
	return 0;
} 

aqz and qjy大佬帮我配好了VS Code,%%%,以后不用DEV了

标签:06,04,idx,int,2024,dep,割掉,hd,edg
From: https://www.cnblogs.com/Orange-Star/p/18117968

相关文章

  • 04-A64指令集2——算术与移位指令
    本章思考题请简述N、Z、C、V这4个条件标志位的作用。答:如下表所示。条件标志位描述N负数标志(上一次运算结果为负值)Z零结果标志(上一次运算结果为零)C进位标志(上一次运算结果发生了无符号数溢出)V溢出标志(上一次运算结果发生了有符号数溢出)下面两条ADD......
  • 2024-04-06 闲话
    同学朋友圈改了一首诗,原作是:曾巩写得实在是有水平。其实太久不读诗之后,看看这种状物诗,触动还是蛮强的。今天晚上做实验的时候突然融会贯通了很多事情,之前看到的很多事情有了motivation,这种感觉实在是太幸福了。但是还是有更多的事情我没有想明白,所以非常自闭,去相亲相爱一家爷......
  • 牛客面经(2024-04-07)
    美团一面4.2 基本全程八股1.双亲委派,类加载,每种类加载器加载什么?双亲委派:启动类加载器、拓展类、应用程序..打破双亲委派机制类加载过程:加载、链接(验证准备解析)、初始化、使用、卸载 2.spring AOP,bean 基于动态代理实现,jdk代理和cglibjdk代理因为是要继承pr......
  • 2024-4-5 清明第二天
    七点五十起床,根本不想起啊,累的要死,起来直奔天安门,十点中到的,但是yy和一吻快十一点才到(yy晚上和一吻住的宾馆),在那站了快一个小时,一起去天安门逛了一圈,全是人啊,,中午去西单吃的比格披萨,排了一个小时队才吃上,吃到下午三点多,吃完去北海公园转了一圈,出来路过中某海,看到很多特警,然后最后......
  • 2024.4.6练习笔记
    浙江理工大学2024年程序设计竞赛(同步赛)Fleetcode题目要求:求出一个序列中对于每个位置\(i\),以\(i\)为起点第一个\(\text{leetcode}\)子序列的终止位置。需要注意的是不要求子序列连续。不存在则答案为零。容易想到双指针,但是会TLE,考虑一些优化。扫描序列,字母是属于......
  • ice-06 运用Burp-Suite进行暴力破解(攻防世界)
    ice-06步骤一:点击超链接,发现只有报表中心才有用。步骤二:点进去发现输入日期范围没有用步骤三:使用BurpSuite进行抓包,把值传到Action到Intruder中步骤四:如图所示进行配置步骤五:攻击,慢慢等一下,会出来异常的数据,从而得到flag提交即可成功!!! ......
  • JetBrains IDE 2024.1 (macOS, Linux, Windows) 发版 - 开发者工具
    JetBrainsIDE2024.1(macOS,Linux,Windows)-开发者工具CLion,DataGrip,DataSpell,Fleet,GoLand,IntelliJIDEA,PhpStorm,PyCharm,Rider,RubyMine,WebStorm请访问原文链接:JetBrainsIDE2024.1(macOS,Linux,Windows)-开发者工具,查看最新版。原创作品,转载请......
  • 2024年PhotoVogue全球摄影公开征稿启事(截止2024年4月20日)免参赛费+总奖金10000美元
    2024年PhotoVogue全球摄影公开征稿启事赛事亮点:亮点一:免参赛费亮点二:作品入选可以参加意大利PhotoVogue摄影节亮点三:两位获奖者将分别获得5000美元创作基金 一、赛事介绍2024年PhotoVogue全球摄影公开征集活动邀请世界各地的艺术家提交关于人类与动物和大自然关系的作品......
  • 17天【代码随想录算法训练营34期】第六章 二叉树part04(● 110.平衡二叉树 ● 257.
    110.平衡二叉树#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defgetDepth(self,root):......
  • ubuntu20.04.6将虚拟机用户目录映射为磁盘Z
    文章目录linux虚拟机设置为NAT模式安装sshd服务映射目录到windows磁盘安装samba套件修改配置文件smb.conf重启smbd并设置用户名和密码windows映射遇到的问题1、设置好之后映射不成功2、smbd下载失败3、smbd密码配置问题4、当有改动时候,最好重启一下smbd服务linux虚......