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

news2024/11/17 16:28:08

今天继续

目录

题目:传送门

思路:

题目:负环判断

思路:

题目:灾后重建

思路:


        

                

        

题目:传送  门

        

思路:

        

先跑一边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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CF1899B 250 Thousand Tons of TNT

题目链接 题目 题目大意 T T T 组测试数据 每组 n n n 个货物&#xff0c;第 i i i 个货物 的重量是 a i a_i ai​ 用k辆货车按顺序装这些货物&#xff0c;条件是每辆车上的货物个数都一样&#xff0c;也即是说 n n n 必须能被 k k k 整除&#xff0c; 求任意两辆车货物总…

什么是PWA(Progressive Web App)?它有哪些特点和优势?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

利用ETLCloud自动化流程实现业务系统数据快速同步至数仓

现代企业有不少都完成了数字化的转型&#xff0c;而还未转型的企业或商铺也有进行数字化转型的趋势&#xff0c;由此可见&#xff0c;数据已经成为企业决策的重要依据。企业需要先获取数据&#xff0c;将业务系统数据同步至数仓进行整合&#xff0c;然后再进行数据分析。为了更…

vivado产生报告阅读分析7-时序报告3

1、“ Timing Summary Report ”详情 “ Timing Summary Report ” &#xff08; 时序汇总报告 &#xff09; 包含下列部分 &#xff1a; • “ General Information ”部分 • “ Timer Settings ”部分 • “ Design Timing Summary ”部分 • “ Clock Summary ”部…

代码随想录算法训练营第五十八天丨 动态规划part18

739. 每日温度 思路 首先想到的当然是暴力解法&#xff0c;两层for循环&#xff0c;把至少需要等待的天数就搜出来了。时间复杂度是O(n^2) 那么接下来在来看看使用单调栈的解法。 什么时候用单调栈呢&#xff1f; 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边…

Leetcode刷题详解——斐波那契数

1. 题目链接&#xff1a;509. 斐波那契数 2. 题目描述&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1…

mock测试数据

1.下载一个jar 架包 地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1G5rVF5LlIYpyU-_KHsGjOA?pwdab12 提取码&#xff1a;ab12 2.配置当前电脑java环境变量 3.在同一文件目录下创建json 数据4.在终端切换到当前目录下启动服务&#xff0c; java -jar ./moco-r…

无损音频播放软件 Colibri mac中文版特点介绍

Colibri for mac是一款轻量级的音频播放器软件。它具有简洁的界面设计和快速启动速度&#xff0c;能够提供流畅的音频播放体验。Colibri支持多种常见的音频格式&#xff0c;包括MP3、FLAC、ALAC、AAC等。它还提供了一些实用的功能&#xff0c;如音频均衡器、音频增益控制、播放…

Go 语言数组基础教程 - 数组的声明、初始化和使用方法

数组用于在单个变量中存储相同类型的多个值&#xff0c;而不是为每个值声明单独的变量。 声明数组 在Go中&#xff0c;有两种声明数组的方式&#xff1a; 使用var关键字&#xff1a; 语法 var array_name [length]datatype{values} // 这里定义了长度 或者 var array_n…

asp.net 学校资源信息管理系统VS开发sqlserver数据库web结构c#编程计算机网页项目

一、源码特点 asp.net 学校资源信息管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 asp.net学校资源管理系统 二、功能介绍 本系统使用Microsoft Visual Studio 2019为开发工具&#xff0c;SQL …

hahahaha发到这里吧

一大早上笑死我 恭喜在座的各位&#xff0c;一直以为这次比赛public和private排名会相差不大&#xff0c;结果前6有4个人都是从银牌歘一下上来的&#xff0c;想象地到他们看到结果时的喜悦

C语言每日一题(32)环形链表

力扣网 141.环形链表 题目描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾…

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C卷

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C卷 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C卷A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&#…

使用Open3D库处理3D模型数据的实践指南

目录 引言 一、安装Open3D库 二、加载3D模型数据 三、处理3D模型数据 1、去除模型中的无效面 2、提取模型特征 四、存储处理后的3D模型数据 五、可视化处理后的3D模型数据 六、注意事项 结论 引言 在处理3D模型数据时&#xff0c;Open3D库是一个功能强大且易于使用的…

分类预测 | Matlab实现基于PSO-SDAE粒子群优化算法优化堆叠去噪自编码器的数据分类预测

分类预测 | Matlab实现基于PSO-SDAE粒子群优化算法优化堆叠去噪自编码器的数据分类预测 目录 分类预测 | Matlab实现基于PSO-SDAE粒子群优化算法优化堆叠去噪自编码器的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现基于PSO-SDAE粒子群优化算法…

golang标准库-crc32的使用

1.概述 crc32实现了32位循环冗余检测算法的实现。目前crc32内部提供 了三种常用的多项式,采用查表法来提高计算checksum的效率。通过crc32.MakeTable()可以获取对应的表&#xff0c;crc32提供了一个IEETABLE可以直接使用&#xff0c;官方链接如下&#xff1a;crc32 package - h…

值得你一生收藏的BMW宝马汽车底盘代号各个版本说明,方便今后查阅使用!

很少有汽车品牌像宝马一样&#xff0c;本属于内部交流使用的底盘代号&#xff08;Development Code&#xff09;&#xff0c;最终延伸为粉丝群体用以精准定位某一年代某一款车型的通用语。随着宝马加速推出新产品&#xff0c;每一年的底盘代号都在更新。你挚爱的强哥现将宝马所…

《Deep learning for fine-grained image analysis: A survey》阅读笔记

论文标题 《Deep learning for fine-grained image analysis: A survey》 作者 魏秀参&#xff0c;旷世研究院 初读 摘要 细粒度图像分析&#xff08;FGIA&#xff09;的任务是分析从属类别的视觉对象。 细粒度性质引起的类间小变化和类内大变化使其成为一个具有挑战性的…

Mac安装win程序另一个方案

前言 今天跟大家分享的是mac装win程序的另一个思路&#xff0c;不需要大动干戈的装双系统、虚拟机。最后分享感受&#xff0c;先说过程吧。 一、思路介绍 其实&#xff0c;就是利用CrossOver&#xff0c;这个软件的介绍大家可以自行了解。不过不得不说这玩意还是国外的人思路新…

OpenAI临时CEO变更,Mira Murati接任,Sam Altman被辞退

2个小时前&#xff0c;OpenAI 官网宣布&#xff0c;首席技术官Mira Murati临时接任OpenAI CEO&#xff0c;并辞退了CEO Sam Altman。新闻里董事会对辞退的原因只有一个简单说明&#xff1a; “奥特曼离职之前&#xff0c;董事会进行了审慎审查&#xff0c;得出的结论是&#…