【算法每日一练]-图论(保姆级教程 篇4(遍历))#传送门 #负环判断 #灾后重建

今天继续

目录

题目:传送门

思路:

题目:负环判断

思路:

题目:灾后重建

思路:


        

                

        

题目:传送  门

        

思路:

        

先跑一边floyd,然后依次加入每个传送门,O(n^5)不行。

所以不能跑n^2次floyd,应该单独把两个有影响的点摘出来处理dis,降为O(n^4)能过
        

#include <bits/stdc++.h>
using namespace std;
const int N=105;
int n,m,f1[N][N],f2[N][N];
inline void back(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			f1[i][j]=f2[i][j];
		}
}
int main(){
	cin>>n>>m;int u,v,w,ans=1e9;
	memset(f1,0x3f,sizeof(f1));
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&w);
		f1[u][v]=w;f1[v][u]=w;
	}
	for(int k=1;k<=n;k++)
	    for(int i=1;i<=n;i++)
	    for(int j=1;j<=n;j++){
	    	f1[i][j]=min(f1[i][k]+f1[k][j],f1[i][j]);
	    	f2[i][j]=f1[i][j];
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<i;j++){//枚举每个传送门
			f1[i][j]=f1[j][i]=0;
			for(int k1=1;k1<=n;k1++)
			for(int k2=1;k2<=n;k2++)
				f1[k1][k2]=min(f1[k1][k2],f1[k1][i]+f1[i][k2]);//由i点进行中转
			for(int k1=1;k1<=n;k1++)
			for(int k2=1;k2<=n;k2++)
				f1[k1][k2]=min(f1[k1][k2],f1[k1][j]+f1[j][k2]);//由i,j点进行中转
			int tmp=0;
			for(int k1=1;k1<=n;k1++)//这里因为我们没有初始化对角线,所以不要加对角线元素
			for(int k2=1;k2<k1;k2++)//把根据无向图的对称型即可
			tmp+=f1[k1][k2];
			ans=min(ans,tmp);
			back();
		}    
	cout<<ans;
	return 0;
}

        

        

题目:负环判断

        

思路:

        

只需要记录最短路长度即可,这个长度不是带权的长度,是经过的点个数 如果长度大于n一定有问题,也就是出现了负环,如果不停止就会走向无穷小

        

#include <bits/stdc++.h> 
using namespace std;
const int N=2005,M=3005;
int n,m,tot;
queue<int>q;
int head[N],vis[N],dis[N],cnt[N];//dis存放到每个点的最短距离,cnt存放对应的长度
struct node{int to;int w;int next;}e[M*2];
void add(int u,int v,int w){e[++tot]=(node){v,w,head[u]};head[u]=tot;}
int spfa(){//判断负环的spfa
	memset(dis,0x3f,sizeof(dis));
	memset(cnt,0,sizeof(cnt));
	memset(vis,0,sizeof(vis));
	while(!q.empty()) q.pop();//要把队列清空(c++不支持队列清空函数)
	dis[1]=0;vis[1]=1;q.push(1);
	while(!q.empty()){
		int cur=q.front();q.pop();
		vis[cur]=0;
		for(int i=head[cur];i;i=e[i].next){
			int v=e[i].to,w=e[i].w;
			if(dis[cur]+w<dis[v]){
				dis[v]=dis[cur]+w;
				cnt[v]=cnt[cur]+1//记录最短路长度;
				if(cnt[v]>n)return 1;//如果长度大于n一定有问题,也就是出现了负环,如果不停止就会走向无穷小
				if(!vis[v])q.push(v),vis[v]=1;	
			}
		} 
	}	
	return 0;
}
int main(){
	int t,u,v,w;
	cin>>t;
	while(t--){
		tot=0;memset(head,0,sizeof(head));
		cin>>n>>m;
		for(int i=1;i<=m;i++){
			scanf("%d%d%d",&u,&v,&w);
			add(u,v,w);
			if(w>=0)add(v,u,w);
		}
		if(spfa())cout<<"YES"<<'\n';
		else cout<<"NO"<<'\n';
	}

}

        

        

题目:灾后重建

         

思路:

        

floyd的最外层k其实是在放入前k个点后的对dis的影响

eg:k为1是仅放入1对dis的影响,k为2是仅放入1和2后对dis的影响,依次类推
那么此题,我们只需要放一个对应的点,就输出一次,这就是前k个点的影响
        

#include <bits/stdc++.h>
using namespace std;
const int N=205;
int n,m,INF;
int a[N],f[N][N];
inline void updata(int k){//依次放入k,对各个dis进行影响
	for(int i=0;i<n;i++)
	for(int j=0;j<n;j++){
		if(f[i][j]>f[i][k]+f[k][j])
		f[i][j]=f[i][k]+f[k][j];
	}
}
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++)  cin>>a[i];//每个村庄的建好时间
	memset(f,0x3f,sizeof(f));INF=f[1][1];//初始化f
	for(int i=0;i<n;i++)  f[i][i]=0;
	int u,v,w;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&w);
		f[u][v]=f[v][u]=w;
	}
	int q,t,now=0;cin>>q;
	while(q--){
		cin>>u>>v>>t;//询问
		while(a[now]<=t&&now<n){//把t时间之前的村庄都考虑进去
			updata(now);now++;
		}
		if(a[u]>t||a[v]>t)cout<<-1<<'\n';//村庄还没修好
		else{
			if(f[u][v]==INF)cout<<-1<<'\n';//根本就无法到达
			else cout<<f[u][v]<<'\n';
		}
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/157920.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

本地jar导入maven

一、通过dependency引入 1.1. jar包放置&#xff0c;建造lib目录 1.2. pom.xml文件 <dependency><groupId>zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.2</version><!--system&#xff0c;类似provided&#x…

ImportError: DLL load failed while importing _iterative: %1 不是有效的 Win32 应用程序。

问题&#xff1a;这个错误是由于导入的模块 _iterative 找不到有效的 Win32 应用程序导致的。可能是由于你的环境中缺少了某个依赖库或者是版本不匹配的问题。 解决方法&#xff1a; 可以尝试以下几种&#xff1a; 确保你的环境中已经安装了所有需要的依赖库&#xff0c;并且…

ChatGPT暂时停止开通puls,可能迎来封号高峰期

前言: 前两日,chat gpt的创始人 San Altman在网上发表了,由于注册的使用量超过了他们的承受能力,为了确保每个人的良好使用体验,chat gpt将暂时停止开通gpt plus。 情况: 前段时间好像出现了官网崩溃的情况,就连api key都受到了影响,所以现在就开始了暂时停止puls的注…

C#学习相关系列之Linq用法---where和select用法(二)

一、select用法 Linq中的select可以便捷使我们的对List中的每一项进行操作&#xff0c;生成新的列表。 var ttlist.select(p>p10); //select括号内为List中的每一项&#xff0c;p10即为对每一项的操作&#xff0c;即对每项都加10生成新的List 用法实例&#xff1a; 1、la…

机器学习中的独立和同分布 (IID):假设和影响

一、介绍 在机器学习中&#xff0c;独立和同分布 &#xff08;IID&#xff09; 的概念在数据分析、模型训练和评估的各个方面都起着至关重要的作用。IID 假设是确保许多机器学习算法和统计技术的可靠性和有效性的基础。本文探讨了 IID 在机器学习中的重要性、其假设及其对模型开…

Linux输入设备应用编程(触摸屏获取坐标信息)

上一章学习了开发板外接键盘并获取键盘的的输入 Linux输入设备应用编程&#xff08;键盘&#xff0c;按键&#xff09;-CSDN博客 本章编写触摸屏应用程序&#xff0c;获取触摸屏的坐标信息并将其打印出来 一 触摸屏数据分析&#xff08;触摸&#xff0c;点击&#xff0c;松开…

CI/CD相关概念学习

文章目录 CI/CD相关概念学习前言CI/CD相关概念介绍集成地狱持续集成持续交付持续部署Devops CI/CD相关应用介绍JenkinsTekton PipelinesSpinnakerTravis CIGoCD CI/CD相关概念学习 前言 本文主要是介绍一些 CI/CD 相关的概念&#xff0c;通过阅读本文你将快速了解 CI/CD 是什么…

python时间变化与字符串替换技术及读JSON文件等实践笔记

1. 需求描述 根据预测出结果发出指令的秒级时间&#xff0c;使用时间戳&#xff0c;也就是设定时间&#xff08;字符串&#xff09;转为数字时间戳。时间计算转换过程中&#xff0c;出现单个整数&#xff08;例如8点&#xff09;&#xff0c;按字符串格式补齐两位“08”。字符…

quickapp_快应用_tabBar

tabBar 配置项中配置tabBar(版本兼容)使用tabs组件配置tabBar语法示例问题-切换tab没有反应问题-数据渲染问题解决优化 问题-tab的动态配置 第三方组件tabbar 一般首页都会显示几个tab用于进行页面切换&#xff0c;以下是几种tab配置方式。 配置项中配置tabBar(版本兼容) 在m…

顶部动态菜单栏的使用

效果图 开发环境 vue3 关键逻辑 //导航栏状态选择 const navbarSolid ref(false); //初始化导航栏高度 const navbarHeight ref(0);/*** 根据滚动距离改变样式*/ function checkNavbarOpacity() {navbarSolid.value window.pageYOffset > navbarHeight.value / 2; }/**…

Redis(列表List)

使用LPUSH从头部添加元素&#xff0c;可以一次添加一个或多个。 使用LRANGE 查看列表中的数据&#xff0c;0表示起始位置&#xff0c;-1表示结束位置。 当然也可以使用RPUSH来从尾部添加元素。 可以使用RPOP从尾部删除元素&#xff0c;会返回删除的元素的值。 同理使用LPOP…

树状图怎么画?推荐这个好用的在线树状图软件!

在日常工作和学习中&#xff0c;我们需要用到各种各样的图表&#xff0c;树状图是其中之一。 树状图是什么&#xff1f; 树状图是一种层次式的图形结构&#xff0c;可以用来展示数据之间的关系&#xff0c;并且可以在一定程度上提高工作和学习的效率。 树状图通常用来表示…

Antv/G2 分组柱状图+折线图双轴图表

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,heightdevice-height"><title>分组柱状图折线图双轴图表</title><styl…

复杂数据统计与R语言程序设计实验二

1、创建一个对象&#xff0c;并进行数据类型的转换、判别等操作&#xff0c;步骤如下。 ①使用命令清空工作空间&#xff0c;创建一个对象x&#xff0c;内含元素为序列&#xff1a;1&#xff0c;3&#xff0c;5&#xff0c;6&#xff0c;8。 ②判断对象x是否为数值型数据。 ③…

CFI(Common Flash Interface)简介

CFI定义了符合CFI规则设备的基本Query接口&#xff0c;包括已知或待拟定的flash Read/Write/Program/Erase控制接口。Query接口以结构体形式定义与flash设备相关的关键参数&#xff0c;但是CFI不会对单个flash设备厂家指定详细的指令集、状态轮询模式以及软件算法。 1.操作概要…

电子商务税收问题:跨境电商的挑战与解决

随着电子商务的崛起&#xff0c;跨境电商已经成为全球贸易的主要动力之一。然而&#xff0c;电子商务的快速发展也带来了一系列税收问题&#xff0c;尤其是涉及跨境交易的税收问题。本文将深入探讨跨境电商所面临的税收挑战&#xff0c;以及政府和国际组织正在采取的解决方案。…

开源与闭源:驾驭大模型未来的关键决断

在数字化的时代洪流中&#xff0c;开源与闭源的选择不断成为技术界的重要分水岭。随着特斯拉CEO埃隆马斯克的言论及其决策&#xff0c;公开支持开源&#xff0c;并糅合商业理念与技术革新&#xff0c;使得这场辩论再次成为公众关注的焦点。那么&#xff0c;在这场关乎技术发展脉…

Java和JavaScript是一样的技术吗?

目录 一、Java 是什么 二、JavaScript 是什么 三、Java 和 JavaScript 的区别 一、Java 是什么 Java是一种广泛使用的计算机编程语言&#xff0c;最初由Sun Microsystems&#xff08;后被Oracle收购&#xff09;于1995年发布。Java是一种面向对象的语言&#xff0c;设计初衷…

STM32定时器实现毫秒/秒级任务框架

STM32定时器实现毫秒/秒级任务框架 CubeMX配置代码分享总结 这是一期代码思路分&#xff0c;通过定时器&#xff08;以定时器10为例&#xff09;实现规定时间间隔执行指定任务。。。。。。 CubeMX配置 关于定时器的配置&#xff0c;这里不做介绍&#xff0c;不懂的可以看&#…