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

Living-Dream 系列笔记 第38期

时间:2024-03-02 17:00:10浏览次数:23  
标签:Living 38 int namespace long 131 floyd Dream dp

T1

floyd 模板。

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

int n,m;
int dp[131][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],dp[i][k]+dp[k][j]);
}

int main(){
	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++) cout<<dp[i][j]<<' '; 
		cout<<'\n'; 
	}
	return 0;
} 

T2

边权改为欧几里得距离即可。

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

int n,m,s,t;
double dp[131][131];
pair<int,int> p[131];

double dis(double x,double y,double xx,double yy){
	return sqrt((xx-x)*(xx-x)+(yy-y)*(yy-y));
}
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],dp[i][k]+dp[k][j]);
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			dp[i][j]=1e9;
	for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y,dp[i][i]=0;
	cin>>m;
	for(int i=1,u,v;i<=m;i++) cin>>u>>v,dp[u][v]=dp[v][u]=dis(p[u].x,p[u].y,p[v].x,p[v].y);
	cin>>s>>t;
	floyd();
	cout<<setprecision(2)<<fixed<<dp[s][t];
	return 0;
} 

T3

枚举集合位置,用 floyd 预处理最短路求和取 \(\min\) 即可。

对于 hack 数据,我们需要将初始值设小,不然在不连通的情况下求和会爆 int。

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

int n,p,c;
int ans=1e9;
int dp[831][831];
int a[531];

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

signed main(){
	cin>>n>>p>>c;
	for(int i=1;i<=p;i++)
		for(int j=1;j<=p;j++)
			dp[i][j]=10000;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=p;i++) dp[i][i]=0;
	for(int i=1,u,v,w;i<=c;i++) cin>>u>>v>>w,dp[u][v]=dp[v][u]=w;
	floyd();
	for(int i=1;i<=p;i++){
		int s=0;
		for(int j=1;j<=n;j++) s+=dp[i][a[j]];
		ans=min(ans,s);
	} 
	cout<<ans;
	return 0;
} 

T4

依题建树跑 floyd 即可。

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

int n,ans=1e9;
int w[131],dp[131][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],dp[i][k]+dp[k][j]);
}

int main(){
	cin>>n;
	memset(dp,0x3f,sizeof(dp));
	for(int i=1,u,v;i<=n;i++){
		cin>>w[i]>>u>>v;
		if(u) dp[i][u]=dp[u][i]=1;
		if(v) dp[i][v]=dp[v][i]=1;
		dp[i][i]=0;
	}
	floyd();
	for(int i=1;i<=n;i++){
		int s=0;
		for(int j=1;j<=n;j++) s+=dp[i][j]*w[j];
		ans=min(ans,s);
	}
	cout<<ans;
	return 0;
}

习题 T1

转移方程改为 \(dis_{i,j}=\min(dis_{i,j},\max(dis_{i,k},dis_{k,j}))\) 即可。

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

int n,m,t;
int ans=1e9;
int dp[331][331];

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(){
	cin>>n>>m>>t;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			dp[i][j]=1e9;
	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]=w;
	floyd();
	for(int i=1,u,v;i<=t;i++) 
		cin>>u>>v,cout<<(dp[u][v]==1e9?-1:dp[u][v])<<'\n';
	return 0;
} 

习题 T2

上题的双倍经验,只不过放到了无向图上。

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

int n,m,t,tot;
int ans=1e9;
int dp[331][331];

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(){
	//freopen("qq.out","w",stdout);
	while(cin>>n>>m>>t&&n&&m&&t){
		cout<<"Case #"<<++tot<<'\n';
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				dp[i][j]=1e9;
		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,u,v;i<=t;i++){
			cin>>u>>v;
			if(dp[u][v]==1e9) cout<<"no path\n";
			else cout<<dp[u][v]<<'\n';
		}
		cout<<'\n';
	}
	return 0;
}

标签:Living,38,int,namespace,long,131,floyd,Dream,dp
From: https://www.cnblogs.com/XOF-0-0/p/18048868

相关文章

  • Living-Dream 系列笔记 第46期
    强连通分量(StronglyConnectedComponents,SCC)。强连通:有向图中,\(x,y\)能相互到达。弱连通:有向图中,\(x\)能到\(y\),\(y\)不能到\(x\)(或反之)。强连通分量:有向图\(G\)中一极大子图\(G1\),使得\(G1\)任意两点均强连通,且\(G1\)不可变得更大(不能添加点)。强连通分量要么是......
  • Living-Dream 系列笔记 第43期
    bellman-ford:因为最短路最多\(n\)点\(n-1\)边,则进行\(n-1\)轮操作,每轮枚举\(m\)边进行松弛即可。时间复杂度\(O(nm)\)。spfa:正确的称呼是队列优化的bellman-ford。我们知道,对于一个点,只有它被松弛了,它的邻接点才有可能被松弛。于是我们用队列记录可能被松弛的点,每......
  • Living-Dream 系列笔记 第45期
    负环,即负权环,指在图\(G\)中边权和为负数的一回路。负环的判定一般有两种方式。以下均以\(n\)点\(m\)边的图\(G\)为例。法一:以边为研究对象。注意到最短路边数一定不超过\(n-1\)边,因此维护\(cnt_x\)表示起点到\(x\)的边数,若某一时刻存在\(cnt_x>n-1\)则存在......
  • Living-Dream 系列笔记 第42期
    T1枚举流量对于花费跑dijkstra并取比值的\(\max\)即可。关于为什么枚举流量不一定当前最优的问题,因为最优解的流量总在枚举范围内,所以无需考虑当前是否最优。#include<bits/stdc++.h>usingnamespacestd;intn,m,ans;intdis[100031];boolvis[100031];structEdge{......
  • Living-Dream 系列笔记 第44期
    比赛链接T1\(100\to10\)。错因:01背包转移方程写错,没有取\(\max\)。并查集合并错写成将u,v而非fnd(u),fnd(v)合并。#include<bits/stdc++.h>usingnamespacestd;intn,m,w;intc[10031],d[10031];intfa[10031];intdp[10031];intfnd(intx){return......
  • Living-Dream 系列笔记 第41期
    稍微讲一下dijkstraqwq。dijkstra、bellman-ford(orspfa)、bfs的区别:dijkstra以点为研究对象;bellman-ford/spfa则以边为研究对象;而bfs可以看作边权为\(1\)(or全都相同)的dijkstra,因此它可以用队列实现。dijkstra的具体实现:将所有点分为两类(黑点/白点),......
  • Living-Dream 系列笔记 第40期
    T1bf的做法是\(n\)次floyd,实测可以卡过。然后我们发现当点\(u\)为重要点时,当且仅当存在\((a,b)\)使得\(u\)为它们的唯一中转点。于是我们令\(vis_{i,j}\)表示\((i,j)\)的唯一中转点,接着在floyd的松弛操作中若能松弛则更新其为当前中转点\(k\),否则若没有更优......
  • Living-Dream 系列笔记 第39期
    T1一头牛能确定关系,当且仅当它能到达/被到达除自己外的所有牛。于是我们建出有向图,跑floyd传递闭包,然后对于每个点统计他能到达的点数是否为\(n-1\)即可。#include<bits/stdc++.h>usingnamespacestd;intn,m,ans;intdp[131][131];vector<int>G[4531];voidfl......
  • 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); ......