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. live-pusher属性值的改变

    例如:组件推流过程中,切换前后摄像头时,要改变mirror的值并使其生效: LivePusherContext = wx.createLivePusherContext() 1. LivePusher ...

  2. Helm 安装使用

    简介 很多人都使用过Ubuntu下的ap-get或者CentOS下的yum, 这两者都是Linux系统下的包管理工具.采用apt-get/yum,应用开发者可以管理应用包之间的依赖关系,发布应用:用户 ...

  3. 【坑】js语法中一些小细节 不注意也出坑 随笔记下 留待后查

    1.switch case内 区分数字 与 字符 ',bl; switch(+lv){ :bl = 1.7;break; :bl = 1.55;break; :bl = 1.4;break; ; } ...

  4. 关于springboot项目的jar和war两种打包方式部署的区别

    关于springboot项目的jar和war两种打包方式部署的区别 关于springboot项目的jar和war两种打包方式部署的区别? https://bbs.csdn.net/topics/392 ...

  5. Easy-Mock模拟get接口和post接口实例

    1.先创建项目,再新建接口 创建项目入口:首页右下角 + 按钮 创建接口入口如下图: 关于mock的语法这里不做说明,可查看mock.js官方查看更详情的资料. 小tip:在Easy-Mock里面支持 ...

  6. final和static语句

    final关键字 final的概念 关键字final,final的意思为最终,不可变.final是个修饰符,它可以用来修饰类,类的成员,以及局部变量.不能修饰构造方法. final的特点 当final ...

  7. UFUN函数 UF_ASSEM UF_PART函数(UF_ASSEM_ask_work_part,UF_PART_ask_part_name)

    UF_initialize(); tag_t work_part_tag=NULL_TAG; ]=""; //获取当前工作部件的tag work_part_tag=UF_ASSEM ...

  8. ps制作马赛克图片

  9. 60: noi.ac #69

    $code$ #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring&g ...

  10. Linux 和 windows下查看运行命令的位置

    经常遇到要查看某个命令的运行文件在哪儿! 比如说vue cli,经常使用vue命令创建项目,如果你对nodejs的全局包安装目录了解可能一下就找到了, 蛋疼的是不一定每个命令都是nodejs下的,有可 ...