首页 > 其他分享 >Living-Dream 系列笔记 第40期

Living-Dream 系列笔记 第40期

时间:2024-03-02 16:56:40浏览次数:27  
标签:Living int 40 131 floyd long Dream dp define

T1

bf 的做法是 \(n\) 次 floyd,实测可以卡过。

然后我们发现当点 \(u\) 为重要点时,当且仅当存在 \((a,b)\) 使得 \(u\) 为它们的唯一中转点。

于是我们令 \(vis_{i,j}\) 表示 \((i,j)\) 的唯一中转点,

接着在 floyd 的松弛操作中若能松弛则更新其为当前中转点 \(k\),

否则若没有更优(即相等)则说明前面的重要点与 \(k\) 可相互替换,直接清空。

最后开个桶记录答案即可,时间复杂度 \(O(n^3)\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,m;
int dp[231][231];
int vis[231][231];
bool l[231];
int tot,ans[231];
 
void floyd(){
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
				for(int j=1;j<=n;j++){
					if(i==j||i==k||j==k) continue;
					if(dp[i][j]>dp[i][k]+dp[k][j]) dp[i][j]=dp[i][k]+dp[k][j],vis[i][j]=k;
					else if(dp[i][j]==dp[i][k]+dp[k][j]) vis[i][j]=0;
				}	
}

signed main(){
	ios::sync_with_stdio(0);
	cin>>n>>m;
	memset(dp,0x3f,sizeof(dp));
	for(int i=1;i<=n;i++) dp[i][i]=0;
	for(int i=1,u,v,w;i<=m;i++) cin>>u>>v>>w,dp[u][v]=dp[v][u]=w;
	floyd();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(vis[i][j]) ans[vis[i][j]]++;
	for(int i=1;i<=n;i++) if(ans[i]) tot++;
	if(!tot) cout<<"No important cities.";
	else for(int i=1;i<=n;i++) if(ans[i]) cout<<i<<' ';
	return 0;
}

T2

法一:按曼哈顿距离 \(\div 2\) 建图跑 floyd 取 \(\max\) 即可,转移时也取 \(\max\)。

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;

int n;
double ans=-1e9,dp[131][131];
pair<int,int> p[131];

void floyd(){
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				dp[i][j]=min(dp[i][j],max(dp[i][k],dp[k][j]));
}

signed main(){
	ios::sync_with_stdio(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y;
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			dp[i][j]=dp[j][i]=abs(p[i].x-p[j].x)+abs(p[i].y-p[j].y);
	floyd();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			ans=max(ans,dp[i][j]);
	cout<<(int)(ceil(ans/2.0));
	return 0;
}

法二:同样方式建图跑 kruskal 即可。

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;

int n,tot;
int fa[131];
double ans,dp[131][131];
pair<int,int> p[131];
struct E{ int u,v,w; }e[10031];

bool cmp(E x,E y){ return x.w<y.w; } 
int fnd(int x){ return (fa[x]==x?x:fa[x]=fnd(fa[x])); }
void kruskal(){
	for(int i=1;i<=tot;i++){
		if(fnd(e[i].u)!=fnd(e[i].v)){
			fa[fnd(e[i].u)]=fnd(e[i].v);
			ans=max(ans,(double)e[i].w);
		}
	}
}

signed main(){
	ios::sync_with_stdio(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			e[++tot]={i,j,abs(p[i].x-p[j].x)+abs(p[i].y-p[j].y)};
	sort(e+1,e+tot+1,cmp);
	kruskal();
	cout<<(int)(ceil(ans/2.0));
	return 0;
}

法三:二分时间用并查集 check 即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,tot;
int fa[131];
double ans;
pair<int,int> p[131];

int fnd(int x){ return (fa[x]==x?x:fa[x]=fnd(fa[x])); }
bool check(int x){
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			if(abs(p[i].first-p[j].first)+abs(p[i].second-p[j].second)<=x*2.0)
				fa[fnd(i)]=fnd(j);
	int cnt=0;
	for(int i=1;i<=n;i++) if(fa[i]==i) cnt++;
	return cnt==1;
}

signed main(){
	ios::sync_with_stdio(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>p[i].first>>p[i].second;
	int l=0,r=1e9+1;
	while(l+1<r){
		for(int i=1;i<=n;i++) fa[i]=i;
		int mid=(l+r)>>1;
		if(check(mid)) r=mid;
		else l=mid;
	}
	cout<<r;
	return 0;
}

标签:Living,int,40,131,floyd,long,Dream,dp,define
From: https://www.cnblogs.com/XOF-0-0/p/18048836

相关文章

  • Living-Dream 系列笔记 第39期
    T1一头牛能确定关系,当且仅当它能到达/被到达除自己外的所有牛。于是我们建出有向图,跑floyd传递闭包,然后对于每个点统计他能到达的点数是否为\(n-1\)即可。#include<bits/stdc++.h>usingnamespacestd;intn,m,ans;intdp[131][131];vector<int>G[4531];voidfl......
  • 20240302指针、晶体管
    指针缓存和内存属于ram缓存是静态sram,由触发器(储存一位二进制数码的基本单元电路)构成,需要很多门电路,一个门电路需要很多晶体管,通电就有内存是动态dram内存条存储一位数据只需要一个晶体管,充放电的地址线数据线输出译码器大小控制选址范围晶体管是充当开关和放大功能的......
  • Living-Dream 周考总结 第3期
    Link,第四场没打。T1\(100\),没挂分。\(\operatorname{lcm}(x,y)=\dfrac{x}{\gcd(x,y)}\timesy\)#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){ //freopen("as01.in","r",stdin); //freopen("as0......
  • Living-Dream 周考总结 第4期
    Link。T1\(100\),没挂分。依题计算即可。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){ //freopen("as01.in","r",stdin); //freopen("as01.out","w",stdout); ios::sync_with_stdio(0); ......
  • Living-Dream 周考总结 第1期
    Link。T1依题计算即可,\(O(1)\)。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){ ios::sync_with_stdio(0); doublen;cin>>n,n=ceil(n/5.0); cout<<setprecision(2)<<fixed; if(n<=100)cout<<0.58......
  • Living-Dream 周考总结 第2期
    Link,第二场没打。T1\(100\),没挂分。依题计算即可,\(O(1)\)。#include<bits/stdc++.h>usingnamespacestd;doublen,a,b;intmain(){ //freopen("as01.in","r",stdin); //freopen("as01.out","w",stdout); cin>>n>&......
  • 240302 杂题
    小知识:VSCode通过调整Editor:CursorSurroundingLines可以达到Typora打字机模式的效果。调到任意一个超过屏幕总行数的值可以让焦点居中。很舒服。T1movehttp://222.180.160.110:1024/contest/5006/problem/1注意到\(x\)和\(y\)的绝对值是分开计算的,只用分类讨论......
  • 20240301-日记
    今天一下子给我赶到别的地方了。本来想趁着请半天假逃过周五的周会,结果狗领导说,要推迟到周一开。我当时真的是,就是小丑就是我自己。年前车子被剐蹭送去保修,昨天才修好,今天就赶到4S店取车。其实也并不是嫌弃对象的家,只是没想到有点朴素过头了。但是想起自己之前老家住的,好像那种就......
  • SC5405A SC5406A丨3.9 GHz射频上变频器
    产品简介频率范围:1MHz至3.9GHz,动态范围>150dBc,输出电平-100dBm至17dBm更多信息请加weixin-pt890111获取SC5405A和SC5406B是三级高动态范围超外差上变频器。设计用于将低频宽带IF信号转换为更高的RF信号,这两个模块具有与直接转换器件相媲美的3阶线性度和噪声性能,但没有......
  • SC5407A SC5408A丨6 GHz射频上变频器
    产品简介:频率范围:100kHz至6GHz;在10kHz偏移,1GHz载波时,低残余相位噪声<-100dBc/Hz更多信息请加weixin-pt890111获取 SC5407A和SC5408A是高性能三级外差上变频器。输入射频频率范围从DC到6GHz,模块具有80MHz,160MHz和320MHz的可选IF带宽。每个模块都使用YIG振荡器作......