【ACM程序设计】求短路 Floyd算法
最短路
floyd算法
- floyd是一个基于贪心思维和动态规划思维的计算所有点到所有点的最短距离的算法。

对于每个顶点v,和任一顶点对(i,j),i=j,v=i, v≠j,如果A[i][j]> A[i][v]+ A[v][j],则将 A[i][j] 更新
为 A[i][v] + A[v][j]的值,并且将 Path[i][j]改为v。

void Floyd(int n,float MGraph[][n],int Path[][n])
{
int i,j,v;
int A[n][n];
//初始化A数组和Path数组
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
A[i][j]=MGraph[i][j];
Path[i][j]=-1;
}
//进行Floyd算法
for(v=0;v<n;v++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(A[i][j]>A[i][v]+A[v][j])
{
A[i][j]=A[i][v]+A[v][j]
Path[i][j]=v;
}
}
void printPath(int u,int v,int path[][max])
{
if(path[u][v]==-1)
printf("<%d,%d> ",u,v);
else
{
int mid=path[u][v];
printPath(u,mid,path);
printPath(mid,v,path);
}
}
floyd例题
U80592 【模板】floyd - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目背景
模板题,无背景
题目描述
给出n个点,m条边的无向图,求每个点到其他点的距离之和%998244354的值
输入格式
第一行两个数n,m含义如上 从第二行开始,共m行,每行三个数x,y,l,代表从x到y点的长度为l
输出格式
n行,每行一个数,第i行代表点i到其他点的距离之和
输入输出样例
输入 #1复制
2 1
1 2 4
输出 #1
4
4
输入 #2
4 5
1 2 1
1 3 2
2 3 2
3 4 3
2 4 4
输出 #2
8
7
7
12
说明/提示
模板题,保证图联通 n<=500 m<=10000 1<=x,y<=n l<=1e9
#include <stdio.h>
#define MaxN 501
#define MOD 998244354
long long distance[ MaxN ][ MaxN ];
void floyd( int pointnum ) {
int i, j, k;
for ( k = 1; k <= pointnum; k ++ ) {
for ( i = 1; i <= pointnum; i ++ ) {
for ( j = 1; j <= pointnum; j ++ ) {
if ( distance[ i ][ k ] != -1 && distance[ k ][ j ] != -1 ) {
if ( distance[ i ][ j ] > distance[ i ][ k ] + distance[ k ][ j ]
|| distance[ i ][ j ] == -1 ) {
distance[ i ][ j ] = distance[ i ][ k ] + distance[ k ][ j ];
}
}
}
}
}
}
int main( ) {
int i, j, k;
int N, M;
long long temp;
scanf("%d %d\n", &N, &M );
for ( i = 1; i <= N; i++ ) {
for ( j = 1; j <= N; j ++ ) {
distance[ i ][ j ] = -1;
}
distance[ i ][ i ] = 0;
}
for ( i = 1; i <= M; i ++ ) {
scanf("%d %d %lld", &j, &k, &temp );
if ( temp < distance[ j ][ k ] || distance[ j ][ k ] == -1 ) {
distance[ j ][ k ] = temp;
distance[ k ][ j ] = temp;
}
}
floyd( N );
for ( i = 1; i <= N; i ++ ) {
temp = 0;
for ( j = 1; j <= N; j ++ ) {
temp += distance[ i ][ j ];
temp %= MOD;
}
printf("%lld\n", temp ); //输入的temp是01 02 03 04最短路径的类加
}
//这题最后输出 7 11 9 11
return 0;
}
【ACM程序设计】求短路 Floyd算法的更多相关文章
- Emergency(山东省第一届ACM程序设计真题+Floyd算法变型)
题目描述 Kudo’s real name is not Kudo. Her name is Kudryavka Anatolyevna Strugatskia, and Kudo is only h ...
- HDU 2066 最短路floyd算法+优化
http://acm.hdu.edu.cn/showproblem.php?pid=206 题意 从任意一个邻居家出发 到达任意一个终点的 最小距离 解析 求多源最短路 我想到的是Floyd算法 但是 ...
- 最短路--floyd算法模板
floyd算法是求所有点之间的最短路的,复杂度O(n3)代码简单是最大特色 #include<stdio.h> #include<string.h> ; const int I ...
- 最短路 - floyd算法
floyd算法是多源最短路算法 也就是说,floyd可以一次跑出所以点两两之间的最短路 floyd类似动态规划 如下图: 用橙色表示边权,蓝色表示最短路 求最短路的流程是这样的: 先把点1到其他点的最 ...
- 【POJ - 3259】Wormholes(最短路 Floyd算法)
Wormholes 题目描述 教学楼里有很多教室,这些教室由双向走廊连接.另外,还存在一些单向的秘密通道,通过它们可以回到过去.现在有 N (1 ≤ N ≤ 500) 个教室,编号 1..N, M ( ...
- 【Aizu - 0189】Convenient Location (最短路 Floyd算法)
Convenient Location 直接翻译了 Descriptions 明年毕业的A为就业而搬家.就职的公司在若干城市都有办公室,不同天出勤的办公室也不同.所以A在考虑住在哪去各个办公室的时长最 ...
- 多源最短路Floyd 算法————matlab实现
弗洛伊德(Floyd)算法是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名. 基本思想 通过Floyd计 ...
- 多源最短路——Floyd算法
Floyd算法 问题的提出:已知一个有向网(或者无向网),对每一对定点vi!=vj,要求求出vi与vj之间的最短路径和最短路径的长度. 解决该问题有以下两种方法: (1)轮流以每一个定点为源点,重复执 ...
- 洛谷 P1119 灾后重建 最短路+Floyd算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1119 灾后重建 题目描述 B地区在地震过后,所有村 ...
随机推荐
- 比较HQL、Criteria、Native-SQL这三者做查询的区别,以及应该如何进行选择?
HQL功能很强大,适合各种情况,但是动态条件查询构造起来很不方便: Criteria 最适合动态查询,但不太适合统计查询,QBE还不够强大.只适合简单的查询: Native-SQL可以实现特定的数据库 ...
- int 和 Integer 有什么区别?
Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本 数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本 数据类型都引入了对应的包装类型(wrappe ...
- Spring-boot-菜鸟-配置-简介
SpringBoot使用一个全局的配置文件,配置文件名是固定的: •application.properties •application.yml 配置文件的作用:修改SpringBoot自动配置的默 ...
- (转载)一篇文章带你分清楚JWT,JWS与JWE
是JWS(JSON Web Signature),也往往导致了人们对于JWT的误解,但是JWT并不等于JWS,JWS只是JWT的一种实现,除了JWS外,JWE(JSON Web Encryption) ...
- Redis ZSet Type
Redis有序集合的操作命令和对应的api如下: zadd [zset] sco 'value' JedisAPI:public Long zadd(final String key, final d ...
- 有没有可能两个不相等的对象有有相同的 hashcode?
有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突.相等 hashcode 值的规定只是说如果两个对象相等,必 须有相同的 hashcode 值, ...
- Java 中,Serializable 与 Externalizable 的区别?
Serializable 接口是一个序列化 Java 类的接口,以便于它们可以在网络上传输 或者可以将它们的状态保存在磁盘上,是 JVM 内嵌的默认序列化方式,成本高. 脆弱而且不安全.Externa ...
- 使用 Docker, 7 个命令部署一个 Mesos 集群
这个教程将给你展示怎样使用 Docker 容器提供一个单节点的 Mesos 集群(未来的一篇文章将展示怎样很容易的扩展这个到多个节点或者是见底部更新).这意味着你可以使用 7 个命令启动整个集群!不需 ...
- C++函数声明的时候后面加const
非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改该类中成员的操作都是不允许的(因为隐含了 ...
- vim recording的使用方法
使用vim时无意间触碰到q键,左下角出现"recording"这个标识,觉得好奇,遂在网上查了一下,然后这是vim的一个强大功能.他可以录 制一个宏(Macro),在开始记录后,会 ...