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 < ...
随机推荐
- 接口调试工具Postman之自动同步Chrome cookies,实现自动登陆验证
前言 在前后端分离开发时,做为后端开发人员,要求独立开发完成某个接口后,开发人员自己需要先测试通过后再提交给测试人员进行测试,否则会出现到测试人员哪里业务流程根本就走不通,或者BUG会过多的情况等. ...
- (14)树莓派 - 修改pi账号密码,开启root账号
https://blog.csdn.net/yoie01/article/details/45115067 1.修改PI账号的密码 password pi 2.开启root账号树莓派使用的linux是 ...
- word2vector的tensorflow代码实现
import collections import math import os import random import zipfile import numpy as np import urll ...
- modis数据处理的坑(MOD02,mod03,mod04,MCD19A2)
一直以来处理modis产品都是用的 modis conversion toolkit(MCTK),用 IDL 来跑感觉好像也没什么问题,好像并没有去验证结果到底对不对,因为用的气溶胶数据 MOD04_ ...
- GSEA 基因集富集分析
http://software.broadinstitute.org/gsea/index.jsp GSEA(Gene Set Enrichment Analysis)是一种生物信息学的计算方法,用于 ...
- 调用Fluent进行多工况计算总结
算例来源:https://confluence.cornell.edu/display/SIMULATION/FLUENT+-+Turbulent+Pipe+Flow 有时候我们对同一模型进行多工况计 ...
- 模拟30A 题解
A. 树 联想起远古考试时做的题 记忆的轮廓. 树上走一些步数的期望. 显然可以直接解方程. 然而复杂度$O(qn^3)$,利用树上的性质优化一下, 直接一遍dfs过程中解出来,可以$O(qnlogm ...
- JS字符串转换为JSON的四种方法
转自:https://www.cnblogs.com/hgmyz/p/7451461.html 1.jQuery插件支持的转换方式: 示例: $.parseJSON( jsonstr ); //jQ ...
- 完全卸载Oracle(亲身体验完整版)
完全卸载Oracle 用Oracle自带的卸载程序不能从根本上卸载Oracle,从而为下次的安装留下隐患,那么怎么才能完全卸载Oracle呢? 那就是直接注册表清除,步骤如下: 开始->设置-& ...
- MyBatis(八):Mybatis Java API枚举类型转化的用法
最近工作中用到了mybatis的Java API方式进行开发,顺便也整理下该功能的用法,接下来会针对基本部分进行学习: 1)Java API处理一对多.多对一的用法: 2)增.删.改.查的用法: 3) ...