题目链接: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. 用“道”的思想解决费用流问题---取/不取皆是取 (有下界->有上界) / ACdreamoj 1171

    题意: 给一个矩阵,给出约束:i(0<i<n)行至少去ai个数,j行至少取bi个数,要求取的数值之和最小. 开始一见,就直接建了二分图,但是,发现这是有下界无上界最小费用流问题,肿么办.. ...

  2. AC日记——小书童——刷题大军 洛谷 P1926

    题目背景 数学是火,点亮物理的灯:物理是灯,照亮化学的路:化学是路,通向生物的坑:生物是坑,埋葬学理的人. 文言是火,点亮历史宫灯:历史是灯,照亮社会之路:社会是路,通向哲学大坑:哲学是坑,埋葬文科生 ...

  3. sugar与阿龙的互怼(第一季)

    §   第一季 回家风波 高考了,啦啦啦~ 快要高考了,显然sugar很伤心. 显然不是因为快要考试了sugar才伤心的. 那为什么??? 因为他们都回家了,但是sugar和他的小伙伴们都不回家!!! ...

  4. [Bzoj3675][Apio2014]序列分割(斜率优化)

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4021  Solved: 1569[Submit][Stat ...

  5. IO重定向

    http://tldp.org/LDP/abs/html/io-redirection.html http://mp.weixin.qq.com/s/JMHDutEG4R0hEaXrYPmCGg 每个 ...

  6. sourcetree帮助文档

    Overview SourceTree可以在bookmarks界面跟踪所有的git和mercurial项目.可以概览工程中是否有需要提交的文件等.添加新的bookmark很简单,可以通过两种方式,通过 ...

  7. TeX系列: tikz-3dplot绘图宏包

    tikz-3dplot包提供了针对TikZ的命令和坐标变换样式, 能够相对直接地绘制三维坐标系统和简单三维图形. tikz-3dplot包当前处于初创期, 有很多功能有待完善. 安装过程如下: (1) ...

  8. SolidEdge如何绘制变化半径倒圆角

    1 在要变化半径的边上打一些点   2 点击倒角命令的参数对话框,选择可变半径   3 选择倒角的直线,右击确认,再依次点击关键点,修改倒角数值,修改之后按回车,继续下一个点,直到结束.  

  9. pomelo加入定时任务

    需求:在arenaserver下添加一个rank定时任务,每一分钟对对玩家进行一次排行. 首先在game-server/app/servers/arena文件夹下添加cron文件夹. 在game-se ...

  10. python web框架企业实战具体解释(第六期)\第三课时-ajax&amp;jquery&amp;webpy

    main.py __author__ = 'Liao' import web import time urls = ( '/gettime','gettime', '/(.*)', 'hello' ) ...