图论——floyd算法

acwing1125.牛的旅行

1.先做一边 f l o y d floyd floyd,求出每个点到其他各点的最短距离,得到 d i s t [ ] [ ] dist[][] dist[][]数组。
2.求出 m a x d [ ] maxd[] maxd[]数组,存放每个点到可达点的距离最大值(遍历dist数组可得),遍历 m a x d maxd maxd可得到各个牧场内的最大的直径 r e s 1 res1 res1
3.连接两个不在同一牧场的点 ( i , j ) (i,j) (i,j),求出新牧场经过路径 d [ i ] [ j ] d[i][j] d[i][j]的所有可能直径中的最小值 r e s 2 = m i n ( d [ i ] [ j ] + m a x d [ i ] + m a x d [ j ] ) res2=min(d[i][j]+maxd[i]+maxd[j]) res2=min(d[i][j]+maxd[i]+maxd[j])
4.最后的答案就是 r e s 1 res1 res1 r e s 2 res2 res2的最大值。

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
typedef pair<int,int> PII;
#define x first
#define y second
const int N = 155;
const int INF = 0x3f3f3f3f;
char g[N][N];
double maxd[N];
PII q[N];
double d[N][N];
int n;
double get_dist(int i, int j)
{double dx = q[i].x - q[j].x, dy = q[i].y - q[j].y;return sqrt(dx * dx + dy * dy);
}
int main()
{cin >> n;for (int i = 1; i <= n; i ++ )cin >> q[i].x >> q[i].y;for (int i = 1; i <= n; i ++ )cin >> g[i];for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ ){if (i != j){if (g[i][j - 1] == '0') d[i][j] = INF;else d[i][j] = get_dist(i, j);}}for (int k = 1; k <= n; k ++)for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ )d[i][j] = min(d[i][j], d[i][k] + d[k][j]);double res1 = 0;for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ )if (d[i][j] < INF) {maxd[i] = max(maxd[i], d[i][j]);res1 = max(res1, d[i][j]);}double res2 = INF;for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ ){if (d[i][j] >= INF)res2 = min(res2, get_dist(i, j) + maxd[i] + maxd[j]);}printf("%.6lf", max(res1, res2));return 0;
}

acwing343.排序

给定若干个元素和若干对二元关系且关系具有传递性“通过传递性推导出尽量多的元素之间的
关系”的问题便被称为传递闭包。
本题的主要思想就是考虑枚举到每一组关系时,我们能不能推出所有点对之间的关系,或者说会不会出现矛盾的情况。
我们定义 d [ i ] [ j ] d[i][j] d[i][j]表示 i , j i,j i,j两个点之间时候存在小于关系,使用floyd推出点对之间的关系, d [ i ] [ j ] ∣ = d [ i ] [ k ] & d [ k ] [ j ] d[i][j] |= d[i][k] \& d[k][j] d[i][j]=d[i][k]&d[k][j]

#include <iostream>
#include <cstring>
using namespace std;
const int N = 26;
int g[N][N];
int d[N][N];
bool st[N];
int n, m;
void floyd()
{memcpy(d, g, sizeof d);for (int k = 0; k < n; k ++ )for (int i = 0; i < n; i ++ )for (int j = 0; j < n; j ++ )d[i][j] |= d[i][k] & d[k][j];}
int check()
{for (int i = 0; i < n; i ++ )if (d[i][i]) return 2;for (int i = 0; i < n; i ++ )for (int j = 0; j < i; j ++ )if (!d[i][j] && !d[j][i]) return 0;return 1;
}
char get_min()
{for (int i = 0; i < n; i ++ ){if (st[i]) continue;bool flag = true;for (int j = 0; j < n; j ++ ){if (!st[j] && d[j][i]){flag = false;break;}}if (flag){st[i] = true;return i + 'A';}}
}
int main()
{while (cin >> n >> m, n || m){memset(g, 0, sizeof g);int type = 0, t;for (int i = 1; i <= m; i ++ ){char str[5];cin >> str;int a = str[0] - 'A', b = str[2] - 'A';if (!type){g[a][b] = 1;floyd();type = check();if (type) t = i;}}if (!type) puts("Sorted sequence cannot be determined.");else if (type == 2) printf("Inconsistency found after %d relations.\n", t);else{memset(st, 0, sizeof st);printf("Sorted sequence determined after %d relations: ", t);for (int i = 0; i < n; i ++ ) printf("%c", get_min());printf(".\n");}}return 0;
}

acwing344.观光之旅

我们考虑依次求出最大值为k且包含k的环的长度。
对于一个环 i − k − j − . . . − i i-k-j-...-i ikj...i来说,环的长度为 d i s t [ i ] [ j ] + w [ i ] [ k ] + w [ k ] [ j ] dist[i][j] +w[i][k]+w[k][j] dist[i][j]+w[i][k]+w[k][j],其中 d i s t [ i ] [ j ] dist[i][j] dist[i][j]为i到j的最短路, w [ i ] [ k ] + w [ k ] [ j ] w[i][k]+w[k][j] w[i][k]+w[k][j]为两条边权之和。我们对floyd算法进行分析:

 for (int k = 1; k <= n; k ++){//每次我们循环到这个位置时,已经求得了经过点不大于//k-1的两点间的最短路径,正好对应了上面的dist[i][j],//也正因此我们可以在此处来求最大值为k且包含k的环的长度for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ )d[i][j] = min(d[i][j], d[i][k] + d[k][j]);}
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 110, M = 10010;
int g[N][N];
int d[N][N];
int pos[N][N];
int path[N];
int n, m;
int cnt;
void get_path(int i, int j)
{int u = pos[i][j];if (u == 0) return ;get_path(i, u);path[cnt ++ ] = u;get_path(u, j);return ;
}
int main()
{cin >> n >> m;memset(g, 0x3f, sizeof g);for (int i = 1; i <= n; i ++ ) g[i][i] = 0;while (m -- ){int a, b, c;cin >> a >> b >> c;g[a][b] =  g[b][a] = min(g[a][b], c);}memcpy(d, g, sizeof d);int res = 0x3f3f3f3f;                                                                                                                                                       for (int k = 1; k <= n; k ++ ){for (int i = 1; i < k; i ++ ){for (int j = i + 1; j < k; j ++ ){if (res > (ll)d[i][j] + g[i][k] + g[k][j]){res = d[i][j] + g[i][k] + g[k][j];cnt = 1;get_path(i, j);path[cnt ++ ] = j, path[cnt ++ ] = k, path[cnt ++ ] = i;}}}for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= n; j ++ ){if (d[i][j] > d[i][k] + d[k][j]){d[i][j] = d[i][k] + d[k][j];pos[i][j] = k;}}}}if (res == 0x3f3f3f3f) cout << "No solution." << endl;else{for (int i = 1; i < cnt; i ++ )cout << path[i] << " ";}return 0;
}

acwing345.牛站

d [ a + b ] [ i ] [ j ] d[a+b][i][j] d[a+b][i][j]表示经过边数为 a + b a+b a+b时从 i i i j j j的最短路径。
d [ a + b ] [ i ] [ j ] = m i n { d [ a ] [ i ] [ k ] + d [ b ] [ k ] [ j ] } d[a+b][i][j]=min\{d[a][i][k]+d[b][k][j]\} d[a+b][i][j]=min{d[a][i][k]+d[b][k][j]}

如果一个一个枚举的话,需要 O ( n 4 ) O(n^4) O(n4),要一个一个往上加边数,从1到2到3…到k再枚举 i , j , k i,j,k i,j,k,时间复杂度太大过不了
往上加的时候,发现可以利用快速幂(二进制)的思想来处理最外层的循环往上加边数的限制,从而将时间复杂度降成 ( n 3 l o g n ) (n^3logn) (n3logn)
g g g数组,也就是一开往里读入的图,通过不断地倍增,在需要的时候,也就是 k & 1 = 1 k\&1=1 k&1=1时,把 r e s res res g g g数组,进行folyd相加
例如,通过倍增,把 g [ i ] [ j ] g[i][j] g[i][j]更新成了恰好经过a条边的最短路,而此时 r e s [ i ] [ j ] res[i][j] res[i][j]数组更新成了恰好经 b b b条边的最短路,这样把两者放在一块开始更新, r e s [ i ] [ j ] res[i][j] res[i][j]就会更新成了从i到j恰好经过 a + b a+b a+b条边的最短路
在更新前会开个 t e m p temp temp临时数组来存暂时要求的 r e s res res数组,因为是把两个数组旧的 r e s res res g g g相加,来更新新 r e s res res数组
不能用更新出来的 r e s res res值,来再更新自己,那样就违背了边数限制,所以先用 t e m p temp temp数组来临时存答案,求完了再把值赋给 r e s res res,从而更新它。

#include <iostream>
#include <cstring>
#include <map>
using namespace std;const int N = 210, M = 110;
int d[N][N];
int res[N][N];
int k, n, m, s, e;
void mul(int a[][N], int b[][N], int c[][N])
{static int temp[N][N];memset(temp, 0x3f, sizeof temp);for (int k = 1; k <= n; k ++ )for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ ){temp[i][j] = min(temp[i][j], b[i][k] + c[k][j]);}memcpy(a, temp, sizeof temp);
}
void qmi()
{memset(res, 0x3f,sizeof res);for (int i = 1; i <= n; i ++ ) res[i][i] = 0;while (k){if (k & 1) mul(res, res, d);mul(d, d, d);k >>= 1;}
}
int main()
{cin >> k >> m >> s >> e;map<int, int>ids; memset(d, 0x3f, sizeof d);if (!ids.count(s)) ids[s] = ++ n;if (!ids.count(e)) ids[e] = ++ n;for (int i = 1; i <= m; i ++ ){int a, b, c;cin >> c >> a >> b;if (!ids.count(a)) ids[a] = ++ n;if (!ids.count(b)) ids[b] = ++ n;a = ids[a], b= ids[b];d[a][b] = d[b][a] = min(d[a][b], c);}qmi();cout << res[ids[s]][ids[e]];return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Transformer+vit原理分析

目录 一、Transformer的核心思想 1. 自注意力机制&#xff08;Self-Attention&#xff09; 2. 多头注意力&#xff08;Multi-Head Attention&#xff09; 二、Transformer的架构 1. 整体结构 2. 编码器层&#xff08;Encoder Layer&#xff09; 3. 解码器层&#xff08;Decoder…

【MySQL】MySQL客户端连接用 localhost和127.0.0.1的区别

# systemctl status mysqld # ss -tan | grep 3306 # mysql -V localhost与127.0.0.1的区别是什么&#xff1f; 相信有人会说是本地IP&#xff0c;曾有人说&#xff0c;用127.0.0.1比localhost好&#xff0c;可以减少一次解析。 看来这个入门问题还有人不清楚&#xff0c;其实…

爬虫基础(三)Session和Cookie讲解

目录 一、前备知识点 &#xff08;1&#xff09;静态网页 &#xff08;2&#xff09;动态网页 &#xff08;3&#xff09;无状态HTTP 二、Session和Cookie 三、Session 四、Cookie &#xff08;1&#xff09;维持过程 &#xff08;2&#xff09;结构 正式开始说 Sessi…

使用langchain ollama gradio搭建一个本地基于deepseek r1的RAG问答系统

目录 简介 环境配置 具体实现 安装依赖 定义模型和prompt 加载检索文档 切割 向量存储 创建检索器 实例化 前端搭建 实现效果 小tips 简介 首先介绍一下使用的几个工具&#xff0c;模型和rag的步骤&#xff0c;注&#xff1a;这里只是简单描述一下&#xff0c;不展…

android获取EditText内容,TextWatcher按条件触发

android获取EditText内容&#xff0c;TextWatcher按条件触发 背景&#xff1a;解决方案&#xff1a;效果&#xff1a; 背景&#xff1a; 最近在尝试用原生安卓实现仿element-ui表单校验功能&#xff0c;其中涉及到EditText组件内容的动态校验&#xff0c;初步实现功能后&#…

hive:基本数据类型,关于表和列语法

基本数据类型 Hive 的数据类型分为基本数据类型和复杂数据类型 加粗的是常用数据类型 BOOLEAN出现ture和false外的其他值会变成NULL值 没有number,decimal类似number 如果输入的数据不符合数据类型, 映射时会变成NULL, 但是数据本身并没有被修改 创建表 创建表的本质其实就是在…

《LLM大语言模型+RAG实战+Langchain+ChatGLM-4+Transformer》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…

【四川乡镇界面】图层shp格式arcgis数据乡镇名称和编码2020年wgs84无偏移内容测评

本文将详细解析标题和描述中提到的IT知识点&#xff0c;主要涉及GIS&#xff08;Geographic Information System&#xff0c;地理信息系统&#xff09;技术&#xff0c;以及与之相关的文件格式和坐标系统。 我们要了解的是"shp"格式&#xff0c;这是一种广泛用于存储…

数据分析系列--⑤RapidMiner进行关联分析(中文数据案例)

一、数据集 二、数据预处理 1.读取数据、拆分、重命名 2.数据预处理 三、关联分析 四、结论 一、数据集 点击下载数据集shopping_basket.xlsx ,这个数据集专门使用中文数据来进行分析. 二、数据预处理 1.读取数据、拆分、重命名 2.数据预处理 三、关联分析 四、结论 Ok,E…

拦截器快速入门及详解

拦截器Interceptor 快速入门 什么是拦截器&#xff1f; 是一种动态拦截方法调用的机制&#xff0c;类似于过滤器。 拦截器是Spring框架中提供的&#xff0c;用来动态拦截控制器方法的执行。 拦截器的作用&#xff1a;拦截请求&#xff0c;在指定方法调用前后&#xff0c;根…

PythonFlask框架

文章目录 处理 Get 请求处理 POST 请求应用 app.route(/tpost, methods[POST]) def testp():json_data request.get_json()if json_data:username json_data.get(username)age json_data.get(age)return jsonify({username: username测试,age: age})从 flask 中导入了 Flask…

134.力扣刷题--加油站--滑动窗口

你知道的&#xff0c;失败总是贯穿人生的始终。 加油站 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#x…

大数据学习之Kafka消息队列、Spark分布式计算框架一

Kafka消息队列 章节一.kafka入门 4.kafka入门_消息队列两种模式 5.kafka入门_架构相关名词 Kafka 入门 _ 架构相关名词 事件 记录了世界或您的业务中 “ 发生了某事 ” 的事实。在文档中 也称为记录或消息。当您向 Kafka 读取或写入数据时&#xff0c;您以事件的 形式执行…

书生大模型实战营5

文章目录 L1——基础岛书生大模型全链路开源开放体系概览书生大模型全链路的数据书生大模型全链路的开源数据处理工具箱预训练 InterEvo微调 XTunerOpenCompass 评测体系部署 LMDeploy智能体 Lagent智能体 MindSearchHuixiangDou L1——基础岛 书生大模型全链路开源开放体系 …

Deepseek技术浅析(二):大语言模型

DeepSeek 作为一家致力于人工智能技术研发的公司&#xff0c;其大语言模型&#xff08;LLM&#xff09;在架构创新、参数规模扩展以及训练方法优化等方面都达到了行业领先水平。 一、基于 Transformer 架构的创新 1.1 基础架构&#xff1a;Transformer 的回顾 Transformer 架…

leetcode——对称二叉树(java)

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 解题方法&#xff1a;&#xff08…

Spring Boot 日志:项目的“行车记录仪”

一、什么是Spring Boot日志 &#xff08;一&#xff09;日志引入 在正式介绍日志之前&#xff0c;我们先来看看上篇文章中&#xff08;Spring Boot 配置文件&#xff09;中的验证码功能的一个代码片段&#xff1a; 这是一段校验用户输入的验证码是否正确的后端代码&#xff0c…

android 圆形弹窗摄像头开发踩坑——源码————未来之窗跨平台操作

一、飘窗刷脸&#xff0c;拍照采用飘窗 刷脸认证安卓接口采用飘窗具有在不干扰用户主要操作的前提下以醒目方式引导用户完成认证&#xff0c;且能灵活定制样式以提升用户体验和认证效率的优点 二、踩坑只有一个扇形 <?xml version"1.0" encoding"utf-8&quo…

DeepSeek的崛起与全球科技市场的震荡

引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的快速发展不断重塑全球科技格局。 近日&#xff0c;中国初创企业DeepSeek推出了一款据称成本极低且性能强大的AI模型&#xff0c;引发全球市场的剧烈反应。NVIDIA、台积电等半导体和AI科技巨头股价大幅下跌&am…

单机伪分布Hadoop详细配置

目录 1. 引言2. 配置单机Hadoop2.1 下载并解压JDK1.8、Hadoop3.3.62.2 配置环境变量2.3 验证JDK、Hadoop配置 3. 伪分布Hadoop3.1 配置ssh免密码登录3.2 配置伪分布Hadoop3.2.1 修改hadoop-env.sh3.2.2 修改core-site.xml3.2.3 修改hdfs-site.xml3.2.4 修改yarn-site.xml3.2.5 …