floyd

Floyd

多元最短路径

注意这个一定是松弛点在最外层循环

(上面这条如果记不住其实跑三次floyd就一定可以得出正解,但毕竟会被卡常)
这是一个耳熟能详的算法,对于每一个oier来讲应该都写过,主要的思想就是通过不断地枚举顶点去进行松弛操作,其实对于单纯的多元最短路,我们可以打dijk加枚举,或者直接bfs加枚举,复杂度都比他小,但是这个算法的作用其实是哟个思想,我们可以利用这个松弛操作的思想来干很多事,比如维护图的连通性,就有点像并查集。
这里来一道维护图的关系的例题,https://www.luogu.com.cn/problem/P2419,
题面就不说了,其实我们不难发现当一个点的入度+出度=n-1时候,这个点的位置就确定了,所以我们就可可以利用枚举中间点的思想去维护两个奶牛值之间的关系,具体代码如下

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

int n,m;
int a[1000][1000]={0};
int cnt[1000]={0};
void get_input(){
	int x,y;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		a[x][y]=1;//x胜利
		cnt[x]++;
		cnt[y]++;//用来记录有多少不等关系,只要有n-1条不等关系那么我们能够确定这个点的位置 
	}
}

void get_floyd(){
	for(int k=1;k<=n;k++){//弗洛伊德一定是松弛点在最外层循环
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(a[i][k]&&a[k][j]&&!a[i][j]){//注意判断这个店要之前没有联通过,要不然cnt会多加
					a[i][j]=1;
					cnt[i]++;
					cnt[j]++;//入度和出度这里没有必要分开
				}
			}
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		if(cnt[i]>=n-1)
			ans++;
	} 
	printf("%d",ans);
}

int main(){
	get_input();
	get_floyd();


	return 0;
}

再来一到例题,这也是利用floyd的思想去在图上dphttps://www.luogu.com.cn/problem/P2888
***注意用临接表去存边时候,如果有重边的出现,那么一定要根据题目去改一下***这个很重要
接下来就是这道题了 其实很容易就想到做发 road[i][j]=min(road[i][j],max(road[i][k],road[k][y])) 这个要特判一下连通性,这个一想到那么就欧克了,其实在图中的问题如果发现点数<1000,就如果是100 500多,就可以想到floyd
代码如下`

#include<bits/stdc++.h>
	using namespace std;
	
	int n,m,t;
	int road[1000][1000];
	void get_input(){
		memset(road,0x7f,sizeof(road));
		scanf("%d%d%d",&n,&m,&t);
		int x,y,z;
		for(int i=1;i<=m;i++){
		//	cout<<"i"<<endl;
			scanf("%d%d%d",&x,&y,&z);
			road[x][y]=min(road[x][y],z);
		}
	}
	
	void get_maxn(){
		for(int k=1;k<=n;k++){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					if(road[i][k]!=0x7f&&road[k][j]!=0x7f&&road[i][j]!=0x7f)
						road[i][j]=min(road[i][j],max(road[i][k],road[k][j]));
				}
			}
		}
	}
	
	void get_ans(){
		int a,b;
		for(int i=1;i<=t;i++){
				//cout<<"i1"<<endl;
			scanf("%d%d",&a,&b);
			if(road[a][b]<=1000000)
				printf("%d\n",road[a][b]);
			else printf("-1\n");
		}
	}
	
	int main(){
		get_input();
		get_maxn();
		get_ans();
		return 0;
	}

   Floyd的思想也可以做传递闭包,就是知道i,k&&k,j的关系,就可以知道i,j的关系,当然spfa更加可以

最小环

其实就是找一个图上的权值和最小的环,这个用这个很好做,我们知道在floyd的最外层循环中,每一次到k,就说明前面的k-1个点的最短路是已经确定的,那么我们每一次去找这个k-1个数中的i,j之后用a[i][k]+a[j][k]+dis[i][j]就是一个环的权值,注意a是原来数组,dis则是确定的最小路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于协同过滤、矩阵分解、gvdt+lr、wide&deep等算法的推荐模型python实现源码含项目说明+数据集.zip 推荐算法的实现,python、jupyter双版本,详尽注释。 正在努力更新中... #### 对MovieLens电影评分小型数据集做Top N推荐: 0. baseline--推荐最热门的N=20部电影,precision=11%, recall=4%, coverage=0.2%, popularity=169。这部分内容包含在UserCF.py 1. UserCF,precision=25%, recall=10%, coverage=10%, popularity=4.4 2. ItemCF,precision=26%, recall=10%, coverage=15%, popularity=4.3 #### 对MovieLens电影评分小型数据集做评分预测: 0. baseline--使用所有评分的均值做预测,MAE:0.83。这部分内容包含在LinearRegression_Rating.ipynb 1. BiasSVD,MAE:0.68 2. LinearRegression,MAE:0.61 #### 对criteo广告展示小型数据集做点击率预测 1. gbdt+lr,binary_logloss:0.4783 #### 对Census数据中的收入做二分类 0. Google TensorFlow Guide上的Wide&Deep基准模型准确率: 0.83。(从有的知乎博主分享的链接来看,已经打不开了) 1. Wide&Deep, accuracy: 0.8587
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于C++实现的连接池、线程池、内存池、对象池项目源码含项目说明.zip ## CPP连接池 ### 关键技术点 MySQL数据库编程、单例模式、queue队列容器、C++11多线程编程、线程互斥、线程同步通信和 unique_lock、基于CAS的原子整形、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型 ## CPP线程池 ### 关键技术点 作为五大池之一(内存池、连接池、线程池、进程池、协程池),线程池的应用非常广泛,不管是客户 端程序,还是后台服务程序,都是提高业务处理能力的必备模块。有很多开源的线程池实现,虽然各自 接口使用上稍有区别,但是其核心实现原理都是基本相同的。 ## CPP内存池 ### 关键技术点 读一下STL和nginx的内存池实现,并且单单的内存池的地方项目提取出来,方便后面对于不同类型的内存池进行分析 ## 对象池 ### 关键技术点 对于new和delete,malloc和free的源码进行阅读,对于创建对象需要多次创建和释放的的情况实现一个对象池 实现的方案使用Queue进行创建

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值