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-图论-最短路模板(邻接矩阵)的更多相关文章

  1. Ombrophobic Bovines 分类: POJ 图论 最短路 查找 2015-08-10 20:32 2人阅读 评论(0) 收藏

    Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16539 Accepted: 3605 ...

  2. K短路模板POJ 2449 Remmarguts' Date

      Time Limit: 4000MS   Memory Limit: 65536K Total Submissions:32863   Accepted: 8953 Description &qu ...

  3. POJ 2387 Til the Cows Come Home(最短路模板)

    题目链接:http://poj.org/problem?id=2387 题意:有n个城市点,m条边,求n到1的最短路径.n<=1000; m<=2000 就是一个标准的最短路模板. #in ...

  4. POJ 2449Remmarguts' Date K短路模板 SPFA+A*

    K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...

  5. poj 2499第K短路模板

    第k*短路模板(单项边) #include <iostream> #include <cstdio> #include <algorithm> #include & ...

  6. poj1511/zoj2008 Invitation Cards(最短路模板题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Invitation Cards Time Limit: 5 Seconds    ...

  7. 51nod_1445 变色DNA 最短路模板 奇妙思维

    这是一道最短路模板题,但是在理解题意和提出模型的阶段比较考验思维,很容易想到并且深深进入暴力拆解题目的无底洞当中. 题意是说:给出一个邻接矩阵,在每个点时,走且仅走向,合法路径中编号最小的点.问题是是 ...

  8. SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

    数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

  9. k短路模板 POJ2449

    采用A*算法的k短路模板 #include <iostream> #include <cstdio> #include <cstring> #include < ...

随机推荐

  1. 开源项目(5-1) yolo万能检测识别

    (1)Windows10+YOLOV3+VisualStudio2017最新版本超详细过程 https://blog.csdn.net/KID_yuan/article/details/8838026 ...

  2. Ansible自动部署lnmp架构+上线电商

    1.首先准备3台机器 ansible机器:192.168.52.34 目标主机:192.168.52.35 目标主机:192.168.52.36 2.关闭防火墙 [root@localhost ~]# ...

  3. 使用Maven创建一个普通java项目

    1.创建项目: 使用Maven目的是是我们能够轻松的管理各种别人写过的包 创建好之后,我们去找我们所需要的包:在mvnrepository.com中找自己所需要的包 例子: 最后将依赖写入pom.xm ...

  4. 常用方法 Entitys转换为DataTable

    效率比较屁,将近可以用 public static DataTable EntitiesToDataTable<T>(List<T> entitys) { Type t = t ...

  5. 8-ESP8266 SDK开发基础入门篇--编写串口上位机软件

    https://www.cnblogs.com/yangfengwu/p/11087558.html 咱用这个编写 ,版本都无所谓哈,只要自己有就可以,不同版本怎么打开 https://www.cnb ...

  6. py3 与 Django 连接数据库: No module named 'MySQLdb'

    问题 在使用 Django 连接 MySQL 数据库的时候,出现了错误 django.core.exceptions.ImproperlyConfigured: Error loading MySQL ...

  7. Mean Average Precision(mAP),Precision,Recall,Accuracy,F1_score,PR曲线、ROC曲线,AUC值,决定系数R^2 的含义与计算

    背景   之前在研究Object Detection的时候,只是知道Precision这个指标,但是mAP(mean Average Precision)具体是如何计算的,暂时还不知道.最近做OD的任 ...

  8. JVM 最多支持多少个线程?

    阅读本文大概需要 2.8 分钟. 原文:www.jb51.net/article/49087.htm McGovernTheory 在 StackOverflow 提了这样一个问题: Java 虚拟机 ...

  9. 数据结构(一)二叉树 & avl树 & 红黑树 & B-树 & B+树 & B*树 & R树

    参考文档: avl树:http://lib.csdn.net/article/datastructure/9204 avl树:http://blog.csdn.net/javazejian/artic ...

  10. Redis中删除过期Key的三种策略

    转载自:http://blog.csdn.net/a_bang/article/details/52986935?locationNum=9&fps=1 项目中有个接口要频繁调用查询数据库中的 ...