首页 > 其他分享 >A-口粮运输

A-口粮运输

时间:2023-11-12 11:33:07浏览次数:32  
标签:运输 typedef ge0 浪费 text sum long 口粮

题意

\(\color{pink}\text{自己看}\)

分析

令点权 \(w_i=a_i-b_i\)。

首先有一个会被套路的一个假做法:对于 \(a\ge b\) 的点,放左部;对于 \(a<b\) 的点,放右部,形成一个二分图。然后不同部的点对连一条边权为它们的最短路长度的边。然后试图去平衡粮食的数量。

一开始感觉很可做,但是经过 \(1\) 个小时,发现会有问题。先看一个 hack。

最优方法:\(4\) 先给 \(6\),中途浪费 \(2\),现在 \(6\) 变成 \(8\);\(8\) 再给 \(-5\),中途浪费 \(3\),刚好全是 \(0\)。

然而从最短路走无法达成这一点。思考为什么,发现原因是走最短路的时候多浪费了一些,而最优方法浪费的要少一点。

考虑一条链,除链尾外其他点 \(w\ge0\)。发现从链头传递到链尾的最大值是 \(\sum w-\sum len\)(\(\text{点权和}-\text{边权和}\)),要求所有前缀 \(\ge0\)。

在只有一个点 \(w<0\) 的情况下,这是一棵树(可能一条链不够填满它)。这启示我们把整个方案分成很多棵树,对此,找最小生成树即可。

此时,重新思考原问题,直觉上来说是由很多棵最小生成树组成的(后来发现每边最多经过一次),考虑枚举生成树上的点集,在加上子集枚举分成两部分,记录该点集是否能成功填满即可。

单组数据复杂度 \(O(3^n+2^n\times m)\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=16,inf=1e9;
int n,m,a[N],b[N],fa[N];
bool f2[1<<N];
struct node{
	int u,v,w;
}len[N*N];
inline bool cmp(node x,node y){
	return x.w<y.w;
}
inline int gf(int x){
	return fa[x]==x?x:fa[x]=gf(fa[x]);
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		for(int i=1;i<=m;++i) scanf("%d%d%d",&len[i].u,&len[i].v,&len[i].w);
		sort(len+1,len+1+m,cmp);
		for(int i=1;i<=n;++i) scanf("%d%d",&a[i],&b[i]);
		bool fd=0;
		memset(f2,0,sizeof f2);
		for(int s=0;s<1<<n;++s){
			int ff=1,tot=0,s1=0;
//			cout<<s<<"---\n";
			for(int i=0;i<n;++i){
//				cout<<i<<" "<<a[i+1]<<" "<<b[i+1]<<"\n";
				if(s&(1<<i)) ++tot,s1+=a[i+1]-b[i+1];
				else if(a[i+1]<b[i+1]) ff=0;
				fa[i+1]=i+1;
			}
			int sum=0,cnt=0;
			for(int i=1;i<=m;++i){
				if((s&(1<<len[i].u-1))&&(s&(1<<len[i].v-1))){
					int x=gf(len[i].u),y=gf(len[i].v);
					if(x!=y){
						fa[x]=y;
						++cnt;
						sum+=len[i].w;
					}
				}
			}
			f2[s]=(s1>=sum&&cnt==tot-1);
//			cout<<s<<" "<<tot<<" "<<cnt<<" "<<s1<<" "<<sum<<"\n";
			for(int ss=s;ss;ss=(ss-1)&s){
				f2[s]|=(f2[ss]&&f2[s^ss]);
			}
			if(ff&&f2[s]){
				fd=1;
				break;
			}
		}
		puts(fd?"Yes":"No");
	}
	return 0;
}

标签:运输,typedef,ge0,浪费,text,sum,long,口粮
From: https://www.cnblogs.com/mRXxy0o0/p/17826911.html

相关文章

  • 智慧矿山:实时监测带式运输机中的异物,提高生产效率
    随着现代农业和工业的发展,带式运输机在各种生产作业中发挥着越来越重要的作用。然而,在带式运输机运行过程中,可能会混入各种异物,这些异物的存在可能会对运输过程和设备本身造成损害。为了解决这一问题,本文将介绍一种基于AI算法的异物识别视频分析方法。带式运输机异物识别的重要性带......
  • [NOIP 2013提高组]货车运输 题解
    [NOIP2013提高组]货车运输题解前置知识Kruskal重构树(内含讲解)+任意一种LCA题目翻译\(n\)座城市,\(m\)条道路,\(q\)次询问,每次求两个点\(x,y\)之间所有路径的最小值的最大值。题目分析其实学了Kruskal重构树差不多看到这个题目就知道怎么写了。其实就是Kruskal重构树的板子,......
  • 智慧矿山:带式运输机空载识别与防止设备空转的惊人策略!
    带式运输机作为一种常见的物料输送设备,广泛应用于矿山、建筑、化工等行业。但在使用过程中,经常会出现空载运行的情况,即带式运输机无物料传送时仍不停工作,导致能源和设备的浪费。因此,对带式运输机进行空载识别并采取相应措施防止设备空转,具有重要的意义。带式运输机空载识别是指通过......
  • 2023NOIP A层联测16 T3 货物运输
    2023NOIPA层联测16T3货物运输题目描述说这是一个仙人掌图,通常将问题转换为环和树的问题在使用圆方树来解决。树解法令\(a_i=s_i-\frac{\sums_i}{n}\),最终令\(a_i=0\)。通过树形dp,从叶子节点向上转移,叶子节点要么向父亲拿资源,要么向父亲传资源,所以转移为:\[a_{fa}+=a_i......
  • Datalogic得利捷将亮相CeMAT ASIA 2023亚洲国际物流技术与运输系统展览会
    上海,2023年10月18日,Datalogic得利捷是一家专注在自动数据采集及工业自动化领域的全球领先供应商,将盛装出席物流行业盛会——CeMATASIA2023亚洲国际物流技术与运输系统展览会。本次展会将于2023年10月24-27日在上海新国际博览中心举办。展位W1 馆B5-2,Datalogic得利捷将携固定式条......
  • 智能化煤矿运输:数字孪生的崭新时代
    煤矿是我国能源工业的重要支柱,然而,煤矿运输过程中一直存在着诸多问题,如安全隐患、能源浪费、效率低下等,这不仅对煤矿行业的可持续发展构成威胁,也对环境造成负面影响。因此,数字孪生技术应运而生,为煤矿运输领域带来了前所未有的改变。 数字孪生技术的兴起数字孪生是一种将现实世......
  • P1967 [NOIP2013 提高组] 货车运输 (生成树,LCA)
    P1967[NOIP2013提高组]货车运输https://www.luogu.com.cn/problem/P1967首先有些边是没用的(比较小的边),比如两个点之间的两条(并行的)路,只有较大的会被走到,小的不会被走,因此可以直接去除小的边,即求最大生成树。接着做求任意两点经过的边的最小值就演变成求树上任意两点的最小树......
  • 解题报告 P2680 [NOIP2015 提高组] 运输计划
    P2680[NOIP2015提高组]运输计划题目链接LCA的题,需要求最大值最小,考虑二分答案。先存储每组询问的距离。然后二分答案时找出所有比当前答案长的距离的重叠部分。在这些重叠部分中找出权值最大的边。判断最长链减去这条边是否小于等于当前答案。否则返回0代码如下/**@......
  • P1967 [NOIP2013 提高组] 货车运输
    P1967[NOIP2013提高组]货车运输因为可能成环,这样可能导致到达点的最小权值不一,所以用最小生成树的方法重新建图然后我是利用倍增的思想建立从i点开始,到上面点的距离ff和最小权值ww因为最小权值不好直接建立,所以不如最后统一建立最后就是寻找最近公共祖先的模板了一组hack......
  • Lnton羚通机器视觉算法平台煤矿皮带运输AI智能监控算法
    Lnton羚通的算法算力云平台是一款卓越的解决方案,具备出众的特点。它提供高性能、高可靠性、高可扩展性和低成本的优势,使用户能够高效地执行复杂计算任务。此外,该平台还提供广泛的算法库和工具,并支持用户上传和部署自定义算法,以增强平台的灵活性和个性化能力。煤矿皮带运输智能监控......