首页 > 其他分享 >网络流24题(3/24)

网络流24题(3/24)

时间:2023-06-04 22:00:51浏览次数:36  
标签:24 int 分点 sum d% 网络 re while

P2756 飞行员配对方案问题

这是一个裸的二分图最大匹配问题,可以用匈牙利算法解决,当然也可以网络流的最大流解决。

我们将源点和每一个英国飞行员连一条边权为1的边,将每一个外籍飞行员和汇点连边权为1的边,再将每一对匹配的英军飞行员和外籍飞行员之间连一条边权为1的边。跑这个图的最大流,就得到了二分图的最大匹配。

\(code:\)

int main(){
	scanf("%d%d",&m,&n);
	while(1){
		scanf("%d%d",&u,&v); 
		if(u==-1&&v==-1)
			break;
		add(u,v);
	}
	for(int i=1;i<=m;++i){
		for(int j=1;j<=n;++j)
			vis[j]=0;
		if(dfs(i))
			++ans;
	}
	printf("%d\n",ans);
	for(int i=1;i<=n;++i)
		if(match[i])
			printf("%d %d\n",match[i],i);
	return 0;
} 

P2765魔术球问题

考虑每一个新放的球,它要么是单独放一个柱子上,要么是放到其他球上面。

我们将每一个球 \(i\) 拆成 \(i\) 和 \(i'\) 。将源点 \(s\) 和 \(i\) 连一条流量为1的边,再将 \(i'\) 和汇点 \(t\) 连一条流量为1的边,表示每一个球能且只能使用一次。

再考虑当前的球能放到哪些球上面。设这些球为 \(j\) ,那么再将 \(j\) 向 \(i'\) 连一条边权为1的边,表示 \(j\) 球后面能接 \(i\) 球。

这样,每放进一个球,就跑一遍 \(dinic\),如果能够找到增广路,说明当前的球能放到其他球上面,否则说明当前的球只能自立门户。

\(code:\)

int dfs(int x,int sum){
	if(x==t)
		return sum;
	int re=sum,k;
	for(int i=now[x];i&&re;i=nxt[i])
		if(d[ver[i]]==d[x]+1&&e[i]){
			now[x]=i;
			k=dfs(ver[i],min(re,e[i]));
			if(!k)
				d[ver[i]]=0;
			else
				nx[(x+1)>>1]=((ver[i]+1)>>1);
			re-=k;e[i]-=k;e[i^1]+=k;
		}
	return sum-re;
}
int main(){
	scanf("%d",&n);
	s=0;t=10001;tot=1;
	for(int i=1;i<=5000;++i){
		//add(i*2-1,i*2,1);add(i*2,i*2-1,0);
		add(s,i*2-1,1);add(i*2-1,s,0);
		add(i*2,t,1);add(t,i*2,0);
		for(int j=1;j*j<i*2;++j)
			if(j*j-i>0)
				add((j*j-i)*2-1,i*2,1),add(i*2,(j*j-i)*2-1,0);
		int sum=0,f=0;
		while(bfs())
			while(sum=dfs(0,1e9))
				f+=sum;
		if(!f){
			++cnt;box[cnt]=i;
		}
		if(cnt>n){
			ans=i-1;break;
		} 
	}
	printf("%d\n",ans); 
	for(int i=1;i<=n;++i){
		int x=box[i];
		while(x!=(10001+1)/2&&x!=0){
			printf("%d ",x);
			x=nx[x];
		}
		printf("\n");
	}
	return 0;
}

P2754 [CTSC1999]家园 / 星际转移问题

看到时间,想到将每个节点拆成500个分点,代表时刻 \(1\)~\(500\) 。

假设某个飞船 \(t\) 时刻在节点 \(p[t]\) ,那么我们把节点 \(p[t]\) 的第 \(t\) 个分点连向节点 \(p[t+1]\) 的第 \(t+1\) 个分点,权值为该飞船容纳的人数 \(h\) 。以上过程模拟了飞船的周期性穿梭。

接下来,对于每一个节点的任何一个分点,向它的下一个分点连权值为 \(inf\) 的边,模拟人停留在某个星球。

最后是 \(s\) 向地球的第一个分点连权值为 \(k\) 的边,月球的每一个分点向汇点连一条权值为 \(inf\) 的边。

怎么判断是否无解以及最短时间呢?考虑二分答案。如果当前的时间为 \(t\) ,那么只能在每个点的第 \(1\)~\(t\) 个分点上跑最大流。如果当前最大流是 \(k\) ,说明所有人都能在 \(t\) 时间内转移到月球,符合题意;否则不符合题意。这样,就能二分出最短时间。而如果最大流永远达不到 \(k\) ,那么无解。

\(code:\)

int main(){
	scanf("%d%d%d",&n,&m,&k);
	tot=1;s=0;t=(n+2)*501+1;
	for(int i=1;i<=m;++i){
		scanf("%d%d",&h,&u);
		for(int j=1;j<=u;++j){
			scanf("%d",&p[j]);
			if(p[j]==-1)
				p[j]=n+2;
			else
				++p[j];
		}
		for(int j=1;j<=500;++j)
			add(p[(j-1)%u+1]+(j-1)*(n+2),p[j%u+1]+j*(n+2),h),add(p[j%u+1]+j*(n+2),p[(j-1)%u+1]+(j-1)*(n+2),0);
		//cout<<p[(j-1)%r+1]+(j-1)*(n+2)<<" "<<p[j%r+1]+j*(n+2)<<endl;
	}
	for(int i=1;i<=n+2;++i)
		for(int j=1;j<=500;++j)
			add(i+(n+2)*(j-1),i+(n+2)*j,1e9),add(i+(n+2)*j,i+(n+2)*(j-1),0);
	add(0,1,k);add(1,0,0);
	for(int i=1;i<=501;++i)
		add((n+2)*i,t,1e9),add(t,(n+2)*i,0);
	l=1,r=501;
	while(l<r){
		for(int i=1;i<=tot;++i)
			edge[i]=e[i];
		for(int i=0;i<=t;++i)
			now[i]=0;
		mid=(l+r)>>1;
		int sum=0,f=0;
		while(bfs())
			while(sum=dfs(0,1e9))
				f+=sum;
		if(f<k)
			l=mid+1;
		else
			r=mid;
	}
	if(r==501)
		printf("0\n");
	else
		printf("%d\n",r-1);
	return 0;
}

标签:24,int,分点,sum,d%,网络,re,while
From: https://www.cnblogs.com/andyl/p/17456469.html

相关文章

  • 连网技术与网络管理2023-06-03 动态路由
    路由协议的类型主要可以分为以下三类:距离矢量协议(DistanceVectorProtocols):这类协议使用跳数(hopcount)作为衡量路径的度量标准。每个路由器仅知道自己相邻路由器的信息,并通过交换路由表来了解整个网络的路由信息。常见的距离矢量协议包括经典的RoutingInformationProtoco......
  • 计算机网络 实验一
    实验一vlan的创建与划分一、实验目的: 1.了解vlan的工作原理;2.学习基于端口划分vlan的方法;3.了解跨交换机的相同vlan之间的通信;4.进一步学习交换机端口的配置命令。二、实验原理:VLAN(VirtualLocalAreaNetwork)是一种虚拟局域网技术,允许将物理网络划分为逻辑上独立的多个虚拟网......
  • 6.824 Lab1
    1例子:运行非并行版mrsequential.go运行一下cd~/6.5840cdsrc/maingobuild-buildmode=plugin../mrapps/wc.gormmr-out*gorunmrsequential.gowc.sopg*.txtmoremr-out-0运行结果2工作2.1改哪些main/mrcoordinator.go和main/mrworker.go不能修改我们只需......
  • m基于ENM-LAP模型的自组织网络平均最短路径长度matlab仿真分析
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要移动自组织网络不但具有终端能量受限、无线信道状况受链路距离影响等特点,还具有节点位置的选择存在偏好的规律。本节建立基于节点位置偏好的网络拓扑演进模型,并利用复杂网络理论对其进行分析。网络拓扑结构产生过......
  • m基于节点位置偏好的自组织网络节点度分布的matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要​移动自组织(AdHoc)网络是一种多跳的临时性自治系统,它的原型是美国早在1968年建立的ALOHA网络和之后于1973提出的PR(PacketRadio)网络。ALOHA网络需要固定的基站,网络中的每一个节点都必须和其它所有节点直接连......
  • 《计算机网络》第六版
     ARPANET:阿帕网络(AdvancedResearchProjectAgencyNetwork) 物理层:中继器(放大器),信号放大,传递信息但不判断对错;链路层:把不可靠的变成正确无误的,保证正确性。网络层:路径选择,找到最佳路径;会话层:双工,半双工,单工;表示层:编码转换,加密和解密IP地址:网络地址+主机地址; 域名到IP......
  • m基于节点位置偏好的自组织网络节点度分布的matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要​      移动自组织(AdHoc)网络是一种多跳的临时性自治系统,它的原型是美国早在1968年建立的ALOHA网络和之后于1973提出的PR(PacketRadio)网络。ALOHA网络需要固定的基站,网络中的每一......
  • GPT大模型下,如何实现网络自主防御
    GPT大模型下,如何实现网络自主防御本期解读专家 李智华华为安全AI算法专家  近年来,随着GPT大模型的出现,安全领域的攻防对抗变得更加激烈。RSAC2023人工智能安全议题重点探讨了人工智能安全的最新发展,包括人工智能合成器安全、安全机器学习以及如何利用渗透测试和强化学习......
  • Linux & Window挂着网络磁盘
    :[url]http://feixiang123.blog.51cto.com/285543/137406[/url]在Windows与Linux下Samba共享文件夹以及映射的详细使用[url]http://wenku.baidu.com/view/2ab6906e58fafab069dc02ad.html[/url]][b]在linux下挂载windows系统的网络共享磁盘:[/b]mount-t......
  • Android网络图片三级缓存策略
    在移动应用中,我们一般将网络图片分为三个级别,第一级别是网络层,即根据图片的url地址可以找到服务器上相应图片,获取这一层的图片会消耗流量,所以我们希望可以获取后本地就永久使用,所以就会有接下来的缓存策略;第二层缓存是在手机内存层,是将第一层的图片下载到手机内存,这种缓存读取速度......