POJ 2387
来源:互联网 发布:java divide向上保留 编辑:程序博客网 时间:2024/05/29 14:55
题目大意:由1走到n的最短时间,t条路,每条路包括两个点,以及从一点走到另一点需要花的时间。
解题思路:dijkstra算法。做法是这样的,首先初始化,将所有的点之间的距离初始化为INF,以及除了起点1以外的与起点的距离也初始化为INF。输入的距离与此时两点之间的距离取小更新为两点之间的距离(之后的输入可能有更短的距离),算法循环n次,每次查找一个到起点的最短距离,并标记,下次不会再取同一点。查找到这个点以后,对所有到起点的距离进行更新,更新方式就是该点到起点的距离与查找到的最短距离加上查找到的该点到更新点的距离,取小。
ac代码:
#include <iostream>#include <cstring>#define INF 100005using namespace std;int T, n, vis[1005], w[1005][1005], t1;int t2, t3, dis[1005];void init(){memset(vis, 0, sizeof(vis));for (int i=1; i<=n; i++){dis[i] = INF;for (int j=1; j<=n; j++)w[i][j] = INF;}dis[1] = 0;vis[1] = 1;}void dijkstra(){for (int i=1; i<=n; i++){t3 = INF;for (int j=2; j<=n; j++)if (!vis[j] && t3 > dis[j])t1 = j, t3 = dis[j];vis[t1] = 1;for (int j=1; j<=n; j++)if (!vis[j] && w[t1][j] < INF)if (dis[j] > t3 + w[t1][j])dis[j] = t3 + w[t1][j];}}int main(){while (scanf("%d%d", &T, &n)!=EOF){init();for (int i=0; i<T; i++){scanf("%d%d%d", &t1, &t2, &t3);w[t1][t2] = min(w[t1][t2], t3);w[t2][t1] = w[t1][t2];}for (int i=2; i<=n; i++)dis[i] = w[1][i];dijkstra();printf("%d\n", dis[n]);}return 0;}
阅读全文
0 0
- POJ 2387
- POJ 2387
- poj 2387
- POJ 2387
- poj 2387
- poj 2387
- POJ 2387
- poj 2387
- poj--2387
- poj 2387
- POJ 2387
- poj 2387
- POJ 2387
- poj 2387
- POJ-2387
- POJ 2387
- poj 2387 dijkstra
- POJ 2387 dijkstra水题
- 如何学好图像处理——从小白到大神?
- ExpandableListView使用中的问题与解决
- js获取时间
- 九度 题目1040:Prime Number
- Struts2 S2-052漏洞分析
- POJ 2387
- Linux的常用基本命令
- HA模式下,扩展HDFS集群遇到的问题,namenode 启动不起来!emmmmmmmm~
- 初学者实践日志2
- 关于工作的一些宏观把握
- javascript 滑动验证 仿淘宝滑动验证
- 什么是动态链接
- 手机web聊天室v1.0
- ubuntu 用户获取root权限