POJ-图论-最短路模板(邻接矩阵)
POJ-图论-最短路模板
一、Floyd算法
刚读入数据时,G为读入的图邻接矩阵,更新后,G[i][j]表示结点i到结点j的最短路径长度
int G[N][N];//二维数组,其初始值即为该图的邻接矩阵
1.init():初始化图邻接矩阵
void init()
{
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
G[i][j] = -;//初始化邻接矩阵,用-1代表无穷
}
G[i][i] = ;//初始化,自己到自己的路径长度为0
}
}
2.floyd():更新最短路径
void floyd()
{
for (int k = ; k <= n; k++)//从1至n循环k
{
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)//遍历所有的i,j
{
if (G[i][k] == -1 || G[k][j] == -1)continue;
if (G[i][j] == -1 || G[i][k] + G[k][j] < G[i][j])G[i][j] = G[i][k] + G[k][j];
}
}
}
}
例 5.5 最短路
模板代码
#include<cstdio>
const int N = ;
int G[N][N];
int n, m; void init()
{
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
G[i][j] = -;//初始化为无穷
}
}
for (int i = ; i <= n; i++)G[i][i] = ;//自己到自己距离是0
} void floyd()
{
for (int k = ; k <= n; k++)
{
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
if (G[i][k] == - || G[k][j] == -)continue;
else if (G[i][j] == - || G[i][j] > G[i][k] + G[k][j])G[i][j] = G[i][k] + G[k][j];
}
}
}
} int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
if (n == && m == )break;
init();
int x, y, t;
for (int i = ; i < m; i++)
{
scanf("%d%d%d", &x, &y, &t);
G[x][y] = G[y][x] = t;
}
floyd();
printf("%d\n", G[][n]);
}
return ;
}
二、Dijkstra算法
G为图邻接矩阵,G[i][j]表示读入的i到j的距离,后面不再更新。d[]为距离数组,d[i]表示结点i到起点的最短距离。vis[N]为访问数组,记录各结点的访问情况。
int G[N][N]; // 图邻接矩阵
int d[N]; // 表示起点到各结点的最短距离
bool vis[N] = { false }; // 表示各结点被访问过与否
1.init():初始化邻接矩阵,到自身的距离为0
void init() // 初始化
{
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
if (i == j) G[i][j] = ;
else G[i][j] = INF;
}
}
}
2.Dijkstra(int start):初始化d[]之后,进行n次循环,每次先确定与起点直接相连的距离最小结点u及其距离d[u],再更新起点到其他结点v的距离d[v]。
void Dijkstra(int start)
{
for (int i = ; i <= n; i++) d[i] = INF;//可达距离都初始化为无穷
d[start] = ; // 起初只有start结点可达
for (int i = ; i <= n; i++)
{
int u = -; // 距离最近的结点u,初始化为-1
int min = INF; // min存放最小的d[u],初始化为无穷
for (int j = ; j <= n; j++)//得到最近的点
{
if (vis[j] == false && d[j] < min)
{
u = j; // 与起点直接相连的距离最小结点
min = d[j];
}
}
if (u == -) return; // 说明剩下的未被访问过的结点都是与起点不可达的
vis[u] = true; // 设为已读
for (int v = ; v <= n; v++)//由新得到的点更新后面所有点
{
// 此处d[u]有一个相加操作,所以在设置很大整数时不能设置为0x7fffffff,会导致溢出
if (vis[v] == false && G[u][v] != INF && d[u] + G[u][v] < d[v]) d[v] = d[u] + G[u][v];
}
}
}
例 5.5 最短路
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = ;
const int INF = 0x3fffffff;
int n, m;
int G[N][N];
int d[N];//起点到各点的距离
bool vis[N] = { false }; void init()
{
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
G[i][j] = INF;
}
G[i][i] = ;
}
for (int i = ; i <= n; i++)
{
d[i] = INF;
vis[i] = false;
}
} void djkstra(int start)
{
d[start] = ;
for (int i = ; i <= n; i++)//每次加入一个结点(这时连起点都还没加入)
{
int u = -;//最近的结点
int min = INF;//最近的距离值
for (int j = ; j <= n; j++)
{
if (vis[j] == false && d[j] < min)
{
min = d[j];
u = j;
}
}
if (u == -)return;//无路可走
vis[u] = true;
for (int v = ; v <= n; v++)//更新其他节点
{
if (vis[v] == false && G[u][v] != INF && d[v] > d[u] + G[u][v])d[v] = d[u] + G[u][v];
}
}
} int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
if (n == && m == )break;
init();
for (int i = ; i < m; i++)
{
int a, b, t;
scanf("%d%d%d", &a, &b, &t);
G[a][b] = G[b][a] = t;
}
djkstra();
printf("%d\n", d[n]);
}
return ;
}
POJ-图论-最短路模板(邻接矩阵)的更多相关文章
- Ombrophobic Bovines 分类: POJ 图论 最短路 查找 2015-08-10 20:32 2人阅读 评论(0) 收藏
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16539 Accepted: 3605 ...
- K短路模板POJ 2449 Remmarguts' Date
Time Limit: 4000MS Memory Limit: 65536K Total Submissions:32863 Accepted: 8953 Description &qu ...
- POJ 2387 Til the Cows Come Home(最短路模板)
题目链接:http://poj.org/problem?id=2387 题意:有n个城市点,m条边,求n到1的最短路径.n<=1000; m<=2000 就是一个标准的最短路模板. #in ...
- POJ 2449Remmarguts' Date K短路模板 SPFA+A*
K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...
- poj 2499第K短路模板
第k*短路模板(单项边) #include <iostream> #include <cstdio> #include <algorithm> #include & ...
- poj1511/zoj2008 Invitation Cards(最短路模板题)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Invitation Cards Time Limit: 5 Seconds ...
- 51nod_1445 变色DNA 最短路模板 奇妙思维
这是一道最短路模板题,但是在理解题意和提出模型的阶段比较考验思维,很容易想到并且深深进入暴力拆解题目的无底洞当中. 题意是说:给出一个邻接矩阵,在每个点时,走且仅走向,合法路径中编号最小的点.问题是是 ...
- SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...
- k短路模板 POJ2449
采用A*算法的k短路模板 #include <iostream> #include <cstdio> #include <cstring> #include < ...
随机推荐
- 2017icpc beijing-I题-Colored Nodes
题意 给定一个n个点m条边的无向图,一开始点i的颜色为i,在第i+kn秒开始时,与节点i相邻的节点会被染成i的颜色(k为自然数) 定义D(i,j)第j秒结束时颜色为i的节点个数,求: $F(i)=\l ...
- BZOJ 2600: [Ioi2011]ricehub 双指针+贪心
不难发现,当我们要选的区间确定后,一定会把仓库安排到中间的稻草上(如果是偶数个的话中间两个都行). 然后按照坐标从小到大枚举右指针,左指针一定不递减,双指针扫一下就行了. code: #include ...
- 实验1c语言开发环境使用和数据类型,运算符和表达式
/*this is first c program*/ # include<stdio.h> int main() { printf("Hello Mars!"); ; ...
- pwd函数实现
/* * 文件名:mypwd.c * 描述: 实现简单的pwd命令 */ #include<stdio.h> #include<stdlib.h> #include<di ...
- nginx 访问控制之 request_uri
$request_uri比$docuemnt_uri多了请求的参数. 主要用来针对请求的uri中的参数进行控制. 示例: if ($request_uri ~ "gid=\d{9,12}&q ...
- Linux环境下安装Redis
记录一下Linux环境下安装Redis,按顺序执行即可,这里下载的是Redis5,大家可根据自己的需求,修改版本号就好了,亲测可行. 1.下载Redis安装包cd /usr/local/wget ht ...
- pytesseract.pytesseract.TesseractError: (1, 'Error opening data file /usr/local/share/tessdata/chi_sim.traineddata Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata"
pytesseract.pytesseract.TesseractError: (1, 'Error opening data file /usr/local/share/tessdata/chi_s ...
- Pycharm 导入Selenium,出现错误
问题 导入Selenium,出现红色波浪线. 解决 点击Pycharm左上角File>setting>Project Interpreter,双击PIP,搜索栏搜索Selenium 然后选 ...
- Spring Boot 怎么打一个可执行 Jar 包?
传统的 Java 应用程序都需要打一个 war 包,并到到 Tomcat webapps 目录下运行. Java 支持打 Jar 包,但没有提供一个标准的方式在一个 Jar 包内再加载嵌入别的 Jar ...
- 如何使用gitbook写文档
本文主要参考资料为该网址:https://github.com/GitbookIO/gitbook/blob/master/docs/setup.md 如何想使用现成的gitbook,网络上虽说可以搜 ...