题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544

题目意思:给出 n 个路口和 m 条路,每一条路需要 c 分钟走过。问从路口 1 到路口 n 需要的最短时间是多少。

这题是最短路的入门题,从理解d-i--j---k(wg自创的,呵呵)到默打到修改,搞左两日终于好了,哈哈哈~~~太感动了。

第一次错是 少了Dijkstra()函数中的 for (j = 1; j <= n; j++) 。

第二次错是把vis[k=j]=1 写在了 if (!vis[j] && dist[j] < mini) 里面。

好好总结自己的错误,以后应该能避免了。(做完郑多燕后,灵感翻来了,成日系实验室里对住堆恶心的实验报告兼做5成功,有种令人想死的感觉,忽略忽略)

顺便帮大家普及下科学知识,经过我的搜罗,

   dijkstra /ˈdɛɪkstra/

别读成 d  - i - j -k 了

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; #define INF 100000000
const int maxn = + ;
int dist[maxn], map[maxn][maxn], vis[maxn];
int n, m; void Init()
{
int i, j, st, en, cost;
for (i = ; i <= n; i++)
dist[i] = (i == ? : INF);
memset(vis, , sizeof(vis));
for (i = ; i <= n; i++)
{
for (j = ; j <= n; j++)
map[i][j] = INF; // 这样也行:map[i][j] = map[j][i] = (i == j ? 0 : INF);
}
for (i = ; i <= m; i++)
{
scanf("%d%d%d", &st, &en, &cost);
map[st][en] = map[en][st] = cost; // 建立邻接矩阵
}
} void Dijkstra()
{
int i, j, k, mini;
for (i = ; i <= n; i++)
{
mini = INF;
for (j = ; j <= n; j++) // 这个循环是用来找出与第i个点最近的点(当然是直接有边相连)
{
if (!vis[j] && dist[j] < mini)
{
mini = dist[j];
k = j;
}
}
vis[k] = ; // 如果把这句放在上面的if里面,就会把有些不该被标记已经过的点置1了,实质只需要置距离i点最短的那个点
for (j = ; j <= n; j++)
{
if (dist[j] > mini + map[k][j]) // mini其实就是dist[k],mini + map[k][j]表示绕过k点走到j点的路径会不会比直接不绕过k要短
dist[j] = mini + map[k][j]; // dist[j] = dist[k]+ map[k][j;
}
}
} int main()
{
while(scanf("%d%d", &n, &m) && (m || n))
{
Init();
Dijkstra();
printf("%d\n", dist[n]);
}
return ;
}

邻接表 + 优先队列 + dijkstra (好强大,^_^)

http://mindlee.net/2011/11/18/shortest-paths-algorithm/

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <climits> // 定义各种数据类型最值得常量,如下面的INF_MAX: 2147483647
#include <queue>
using namespace std; const int NV = + ;
const int NE = 2e4 + ; int n, m; struct Dijkstra
{
int n, size;
int dis[NV], head[NV];
int mark[NV]; struct node
{
int v, dis;
node() {}
node(int V, int DIS): v(V), dis(DIS){}
friend bool operator < (const node a, const node b)
{
return a.dis > b.dis; // 结构体中,dis小的优先级高
}
}; struct edge
{
int v, w, next;
edge() {}
edge(int V, int W, int NEXT): v(V), w(W), next(NEXT) {}
}E[NE]; inline void init(int vx)
{
n = vx, size = ;
memset(head, -, sizeof(int)*(vx+));
} inline void insert(int u, int v, int w)
{
E[size] = edge(v, w, head[u]); // E[size]. v = u, E[size].w = v, E[size].next = head[u]
head[u] = size++;
} /* void print() // 打印每个点的邻接表
{
for (int i = 0; i < n; i++)
{
printf("%d: ", i);
for (int j = head[i]; j != -1; j = E[j].next)
{
printf(" %d", E[j].v);
}
printf("\n");
}
}
*/
int dijkstra(int src, int des) // src: 0 des: n-1
{
node first, next;
priority_queue<node> Q;
for (int i = ; i <= n; i++)
{
dis[i] = INT_MAX;
mark[i] = false;
}
dis[src] = ;
Q.push(node(src, )); // 把起始点入队 while (!Q.empty())
{
first = Q.top();
Q.pop();
mark[first.v] = true; for (int i = head[first.v]; i != -; i = E[i].next)
{
if (!mark[E[i].v])
{
next = node(E[i].v, first.dis + E[i].w);
if (next.dis < dis[next.v])
{
dis[next.v] = next.dis;
Q.push(next);
}
}
} // end for
} // end while
return dis[des];
} // end dijkstra
}G; int main()
{
while (scanf("%d%d", &n, &m) != EOF && (m + n))
{
G.init(n);
while (m--)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
G.insert(u-, v-, w);
G.insert(v-, u-, w);
}
// G.print();
printf("%d\n", G.dijkstra(, n-));
}
return ;
}

Spfa + 邻接矩阵

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; const int INF = 1e9;
const int maxn = + ;
int dist[maxn], map[maxn][maxn];
bool mark[maxn];
int N, M; int Spfa()
{
for (int i = ; i <= N; i++)
{
mark[i] = false;
dist[i] = INF;
}
queue<int> Q;
dist[] = ;
mark[] = true;
Q.push(); while (!Q.empty())
{
int first = Q.front();
Q.pop();
mark[first] = false; for (int i = ; i <= N; i++)
{
if (dist[first] + map[first][i] < dist[i])
{
if (!mark[i])
{
Q.push(i);
mark[i] = true; // mark 写在dist[i] 下一行也能过
}
dist[i] = dist[first] + map[first][i];
// mark[i] = true;
}
}
}
return dist[N];
} int main()
{
while (scanf("%d%d", &N, &M) != EOF && (N+M))
{
int A, B, C;
for (int i = ; i <= N; i++)
{
map[i][i] = INF;
for (int j = i+; j <= N; j++)
map[i][j] = map[j][i] = INF; // 双向边!!!
}
while (M--)
{
scanf("%d%d%d", &A, &B, &C);
map[A][B] = map[B][A] = C;
}
printf("%d\n", Spfa());
}
return ;
}

顺便写写:1874

scanf("%d%d", &st, &en);    // st:起点  en:终点
for (int i = 0; i < n; i++)
{
dist[i] = map[st][i];     // 构建起点到其他点之间的距离,INF代表不可达
}

输出注意下即可:printf("%d\n", dist[en] == INF ? -1 : dist[en]);

hdu 2544 最短路 解题报告的更多相关文章

  1. ACM: HDU 2544 最短路-Dijkstra算法

    HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descrip ...

  2. UESTC 30 &&HDU 2544最短路【Floyd求解裸题】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. HDU 4303 Hourai Jeweled 解题报告

    HDU 4303 Hourai Jeweled 解题报告 评测地址: http://acm.hdu.edu.cn/showproblem.php?pid=4303 评测地址: https://xoj. ...

  4. HDU - 2544最短路 (dijkstra算法)

    HDU - 2544最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以 ...

  5. hdu 2544 最短路

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shi ...

  6. HDU 2544最短路 (迪杰斯特拉算法)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others)    Me ...

  7. (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。

    floyd解法 今天初看dijkstra,先拿这两题练手,其他变形题还是不是很懂. 模版题,纯练打字... HDU 1874: #include <cstdio> #define MAXN ...

  8. HDU 2544 最短路 最短路问题

    解题报告: 这题就是求两个单源点之间的最小距离,属于最短路问题,由于数据量很小,只有100,所以这题可以用弗洛伊德也可以用迪杰斯特拉,都可以过,但是用迪杰斯特拉会快一点,但用弗洛伊德的代码会稍短一点, ...

  9. 题解报告:hdu 2544 最短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t ...

随机推荐

  1. 【shell】shell编程(三)-if,select,case语句

    通过前两篇文章,我们掌握了shell的一些基本写法和变量的使用,以及基本数据类型的运算.那么,本次就将要学习shell的结构化命令了,也就是我们其它编程语言中的条件选择语句及循环语句. 不过,在学习s ...

  2. Android 获取屏幕事件的坐标

    通常情况下我们只能获取当前Activity的画面坐标,那有时候我们需要做到一种类似于c++ hook的后台运行程序能够监听到前台用户的操作并记录下来,往往这类程序都是为自动化测试服务的. Androi ...

  3. nginx配置 location root alias

    语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因 ...

  4. sqlite 常用操作

    #查看当前数据库信息 .database #列出所有表 .tables #列出所有字段 .schema   或者  .schema table_name #清空一张表 delete from tabl ...

  5. spring mvc拦截器原理分析

    我的springMVC+mybatis中的interceptor使用@autowired注入DAO失败,导致报空指针错误,这个是为什么呢? :空指针说明没有注入进来,你可以检查一下你的这个拦截器int ...

  6. 在智能手机上跟踪ADS-B系统的飞机航线信息

    飞机飞行的中断可能会给航空公司造成数十亿美员的损失,但即便如此大多数现代商业航班仍旧依赖于存有严重安全问题的空中交通管制系统.到2020年,这些系统将会被升级为一个被称之为NextGen的系统,该系统 ...

  7. es删除文档或者删除索引

    es删除文档或者删除索引 学习了:https://www.imooc.com/video/15771 删除文档: DELETE http://127.0.0.1:9200/people/man/1 删 ...

  8. vim编码方式配置的学习和思考

    哎呀呀,今天9月30号,立即就要十一长假了,心里还有点小小浮躁.工作已经基本做完,想成为技术大牛怎么能够如此浮躁.为了应付浮躁的心灵,决定写一篇小博,平静一把. 今天一个配置文件须要有中文,而且同事是 ...

  9. hadoop2.7.1 nutch2.3 二次开发windows环境

     Hadoop windows编译: 能够略过这一段,直接下载hadoo2.7.1 bin文件.我的资源里有终于生成的winutils.exe和一些native code,放在bin文件夹即可了 參 ...

  10. 程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25

    程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都 ...