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

2024-04-03

时间:2024-04-03 21:47:19浏览次数:14  
标签:03 04 idx int cur 2024 dep hd edg

2024-04-03

上午去杜甫草堂了
中午吃火锅了
下午打球了
晚上来写题了
(就写了一个……)

Exploration plan

发现答案是有上界的
并且是最小化最大值
直接想到二分

Floyd 预处理 两点之间的距离

二分一个 limit
点拆成左右两个
每次距离不超过 limit 的点对之间连容量为 Inf 的边表示可以转移棋子
源点向每个左部点连容量为初始棋子数的边,表示最多能转移这么多
每个右部点向汇点连容量为 1 的边,因为移动更多的棋子到这里一定不会更优秀

注意:

  1. 可能有重边,保留最小值
  2. 也可以向自己转移棋子,所以 Floyd 自己到自己的距离设置为 0
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>

#define int long long

using namespace std;

const int V=800,E=30000;
const int N=V*2+100,M=2*(2*V+V*V+100);
const int Inf=1e8;

int n,m;
int key;
int num,cnt[V],pos[V];

int dis[V][V];

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

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() {
	memset(dep,-1,sizeof(dep));
	queue<int> q;
	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;
}

void build(int lim) {
	idx=2;
	memset(hd,-1,sizeof(hd));
	s=0,t=2*n+1;
	for(int u=1;u<=n;u++) {
		adde(s,u,cnt[u]);
		for(int v=1;v<=n;v++)
	 	if(dis[u][v]<=lim) adde(u,v+n,Inf);
	}
	for(int v=1;v<=n;v++) adde(v+n,t,1);
}

bool check(int lim) {
	build(lim);
	return dinic()>=key;
}

signed main() {
	scanf("%lld%lld%lld%lld",&n,&m,&num,&key);
	for(int i=1;i<=num;i++) {
		scanf("%lld",&pos[i]);
		cnt[pos[i]]++;
	}
	memset(dis,0x3f,sizeof(dis));
	for(int i=1;i<=m;i++) {
		int u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		dis[u][v]=dis[v][u]=min(dis[u][v],w);
	}
	for(int i=1;i<=n;i++) dis[i][i]=0;
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
//	for(int i=1;i<=n;i++) {
//		for(int j=1;j<=n;j++) printf("%d ",dis[i][j]);
//		puts("");
//	}
	if(!check(1731311)) {
		puts("-1");
		return 0;
	}
	int lft=0,rgh=2000000,ans=-1;
	while(lft<=rgh) {
		int mid=lft+rgh>>1;
		if(check(mid)) ans=mid,rgh=mid-1;
		else lft=mid+1;
	}
	printf("%lld\n",ans);
	
	return 0;
}

标签:03,04,idx,int,cur,2024,dep,hd,edg
From: https://www.cnblogs.com/Orange-Star/p/18113566

相关文章

  • 小美的排列构造(美团2024届秋招笔试第一场编程真题)
    题面核心思想贪心最大最小次大次小·····这样就行了。代码importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){finallongMOD=(long)(1e9+7);Scannerscanner=newScanner(System.in);int......
  • 小美的排列询问(美团2024届秋招笔试第一场编程真题)
    题面核心思想模拟需要注意的是1~n只会出现一次所有nums[i]如果等于x(或y),下一位等不等于y(或x),就可以直接判断出结果了。代码importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){finallongMOD=(long)(1e9+7);......
  • #19 2024.4.3
    694.pjudge21633【PER#2】2048695.loj3483「USACO2021.2Platinum」CountingGraphs696.loj2468「2018集训队互测Day2」神秘货币史。697.cf1935fAndrey'sTree反思。考虑一个\(mx\rightarrowmx+1\)的构造。那么它挺赢的。考虑一些cornercase,即\(u=mx......
  • 2024.04 别急记录
    1.餐巾计划问题建图跑费用流即可:\((S,1,\inf,p)\);\(\foralli\in[1,N],(i,i+N,r_i,0)\);\(\foralli\in[1,N],(S,i+N,r_i,0)\);\(\foralli\in[1,N],(i,T,r_i,0)\);\(\foralli\in[1,N),(i,i+1,\inf,0)\);\(\foralli\in[1,N-n],(i+N,i+n,\inf,f)\);\......
  • P3038 [USACO11DEC] Grass Planting G
    原题链接题解树上区间修改加单点查询,虽然可以树状数组,但是线段树更通用一点然而线段树通常处理的是点权,可这里是边权,怎么办呢?我们可以把边权转换成点权,由于每个点的子边有若干个,但父边有且只有一个,这样我们就把边权变成边下方点的点权然后区间修改和单点求和的时候把lca的点权......
  • 随堂练习2024.4.3
    建立规则,仪式,流程,模式:  定义代码编写和审查的标准,确保开发质量。  实施敏捷开发的仪式,如日常站会,迭代评审和回顾会议,以提高团队协作和项目透明度。 建立清晰的开发流程和里程碑,确保项目按时推进。给好行为正面的反馈:  对于按时完成任务且代码质量高的开发人员......
  • 2024.3.8力扣每日一题——找出美丽数组的最小和
    2024.3.8题目来源我的题解方法一数学题目来源力扣每日一题;题序:2834我的题解方法一数学经过分析,在target之前,取小于等于target/2的正整数才能使得和最小,并且满足条件3。时间复杂度:O(n)空间复杂度:O(n)publicintminimumPossibleSum(intn,inttarget)......
  • 2024年抖店还能做吗?市场是否趋于饱和?谈谈我的看法!
    我是电商珠珠现在已经2024年了,抖店距离现在已经发展了有4年多的时间了。目前红利还在,但是不如20年的风口那么大了。况且,现在已经上边有很多商家,除非你很优秀,否则不建议你做这个。抖店现如今严查无货源,有些新手可能还不知道什么是无货源,我来解释一下。无货源就是不需要货源,只......
  • 【问题记录】CCES编译报错:“[Error li1030] Can not open input file ‘libadi_sigma
    一,问题现象编译工程时,报错提示:“[Errorli1030]Cannotopeninputfile‘libadi_sigma_sharc_awc.dlb’”,“[Errorli1030]Cannotopeninputfile‘libadi_sigma_sharc_nwc.dlb’”:二,问题原因&解决方法没有安装对应的插件,安装插件:SigmaStudioForSHARC-SH-Rel2.......
  • 阿里云可观测 2024 年 3 月产品动态
    本月可观测热文回顾文章一览:全新架构!日志服务SLS自研免登录方案发布AIOps智能运维:有没有比专家经验更优雅的错/慢调用分析工具?一文看懂如何做好SQL质量监控使用SPL高效实现FlinkSLSConnector下推功能快报点击此处,了解更多产品详情。......