题目链接: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. TYVJ3680 找妹子

    时间: 1000ms / 空间: 1200KiB / Java类名: Main 背景 本题由 @fjzzq2002 提供,已奖励20金币. 描述 sps是zzq的好伙伴. sps一天叫来了许多个妹子. ...

  2. 【Codevs1907】方格取数3(最小割)

    题意:在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. n,m<=30 思路:如果 ...

  3. ActivityGroup中监听返回按键

    如果你想使用ActivityGroup来统一管理Activity的话,当然首先这是一种很好的方法,但是如果你想在ActivityGroup里面拦截返回按键来进行统一管理的话,直接覆写onKeyDown ...

  4. OO第三单元作业小结

    一.JML理论基础及应用工具链情况 理论基础 1.JML表达式 \result:表示方法执行后的返回值. \old(expr):表示一个表达式expr在相应方法执行前的取值. \foall:全称量词修 ...

  5. BZOJ1016最小生成树计数 最小生成树 + 排列组合

    @[最小生成樹, 排列組合] Discription 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的 最小生成树.(如果两颗最小生成树中至少有一条边不 ...

  6. websocket笔记

    本文为原创,转载请注明出处: cnzt       文章:cnzt-p http://www.cnblogs.com/zt-blog/p/6742746.html websocket -- 双向通信网 ...

  7. ipython结合virtualenv使用

    1.virtualenv使python的开发环境相互隔离,隔离环境可以安装自己的依赖包,避免冲突 2.ipython是交互使用python变的便利 3.在virtualenv环境里使用ipython即 ...

  8. Mathematica 表达式求值

    表达式是变量之间的运算关系.表达式求值就是对变量赋值并运算出结果的过程. 针对于Mathematica中的表达式.有两种方法获得其值. 一是对对应的变量直接赋值.这样对应的表达式在调用时便会直接运算得 ...

  9. require.js结合项目的使用心得

    1.首先引入require.js 2.配置config.js文件 var $cdn_url=/'''/''/;----->指定文件一个共用的路径 require.config({ baseUrl ...

  10. Android自己主动升级框架

    先看效果 使用 package com.ydl.versionupdate; import android.app.Activity; import android.content.Context; ...