题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=2544

思路

最短路算法模板题,求解使用的Dijkstra算法、Floyd算法、SPFA算法可以当做求解最短路问题的模板使用。

代码

Dijkstra算法:

 #include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int INF = 0x3f3f3f;
const int N = + ;
int map[N][N];
int dist[N];
int visit[N];
int n, m; void dijkstra()
{
memset(visit, , sizeof(visit));
for (int i = ; i <= n; i++)
dist[i] = map[][i];
dist[] = ;
int min_dist, now;
for (int i = ; i <= n; i++)
{
min_dist = INF;
for (int j = ; j <= n; j++)
{
if (!visit[j] && dist[j] < min_dist)
{
min_dist = dist[j];
now = j;
}
}
if (min_dist == INF) break;
visit[now] = ;
for (int j = ; j <= n; j++) //“松弛”操作
{
if (dist[now] + map[now][j] < dist[j])
dist[j] = dist[now] + map[now][j];
}
}
printf("%d\n", dist[n]);
} int main()
{
//freopen("hdoj2544.txt", "r", stdin);
while (scanf("%d%d", &n, &m) == && n)
{
memset(map, INF, sizeof(map));
int a, b, c;
for (int i = ; i < m; i++)
{
scanf("%d%d%d", &a, &b, &c);
map[a][b] = map[b][a] = c;
}
dijkstra();
}
return ;
}

Floyd算法:

 #include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int INF = 0x3f3f3f;
const int N = + ;
int map[N][N];
int n, m; void floyd()
{
for (int k = ; k <= n; k++)
for (int i = ; i <= n; i++)
for (int j = ;j <= n; j++)
map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
printf("%d\n", map[][n]);
} int main()
{
//freopen("hdoj2544.txt", "r", stdin);
while (scanf("%d%d", &n, &m) == && n)
{
memset(map, INF, sizeof(map));
int a, b, c;
for (int i = ; i < m; i++)
{
scanf("%d%d%d", &a, &b, &c);
map[a][b] = map[b][a] = c;
}
floyd();
}
return ;
}

SPAF算法:

 #include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std; struct Edge
{
int s, e, dist; //边的起点、终点、长度 Edge() {}
Edge(int s, int e, int d) :s(s), e(e), dist(d) {}
}; const int INF = 0x3f3f3f;
const int N = + ;
vector<Edge> v[N]; //使用邻接表存储图
int dist[N];
int visit[N];
int n, m; void spfa(int s)
{
queue<int> q;
memset(dist, INF, sizeof(dist));
memset(visit, , sizeof(visit));
q.push(s);
visit[s] = ;
dist[s] = ; while (!q.empty())
{
int s = q.front();
q.pop();
visit[s] = ;
for (int i = ; i < v[s].size(); i++)
{
int e = v[s][i].e;
if (dist[e] > dist[s] + v[s][i].dist)
{
dist[e] = dist[s] + v[s][i].dist;
if (visit[e] == )
{
visit[e] = ;
q.push(e);
}
}
}
}
printf("%d\n", dist[n]);
} int main()
{
//freopen("hdoj2544.txt", "r", stdin);
while (scanf("%d%d", &n, &m) == && n)
{
for (int i = ;i <= n; i++)
v[i].clear();
int a, b, c;
for (int i = ; i < m; i++)
{
scanf("%d%d%d", &a, &b, &c);
v[a].push_back(Edge(a, b, c));
v[b].push_back(Edge(b, a, c));
}
spfa(); //求结点1到其余各点的最短路径
}
return ;
}

最新文章

  1. jQuery Flat Shadow – 轻松实现漂亮的长阴影效果
  2. Visual Studio调试之避免单步跟踪调试模式
  3. python概要
  4. Linux centos7环境下安装MySQL的步骤详解
  5. 使用bootstrap建立响应式网页——通栏轮播图(carousel)
  6. angular1.x + ES6开发风格记录
  7. zoom:1是什么意思
  8. prop与attr的区别
  9. Centos7+LVS-DR+Apache负载均衡web实验
  10. SQL Server 恢复数据库至指定时间点
  11. PHP对接淘宝客api完成APP引流优惠券
  12. 【转】使用STM32F4的CCM内存
  13. Linux 小知识翻译 - 「文件系统的种类」
  14. 13.1 dubbo服务降级源码解析
  15. 发送邮件--MFMailComposeViewController
  16. 用Python建设企业认证和权限控制平台
  17. 叉积(POJ - 2318 )
  18. 关于java中ArrayList的快速失败机制的漏洞——使用迭代器循环时删除倒数第二个元素不会报错
  19. [转]解读Unity中的CG编写Shader系列8——多光源漫反射
  20. LintCode-71.二叉树的锯齿形层次遍历

热门文章

  1. List(JDK1.7)(2)
  2. 同一个IIS绑定多个Htts 站点问题
  3. [整理]C语言中字符常量与ASCII码
  4. 《大型网站SEO优化实践》学习分享
  5. 【译】第十篇 Replication:故障排除
  6. git 配置 SSH密钥
  7. python作业ATM(第五周)
  8. 20165320 Java实验三:敏捷开发与XP实践
  9. win10定时关机
  10. aarch64_j2