题目链接: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. POJ 2096 (dp求期望)

    A - Collecting Bugs Time Limit:10000MS     Memory Limit:64000KB     64bit IO Format:%I64d & %I64 ...

  2. msp430项目编程46

    msp430综合项目---监控系统46 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结

  3. HDU 1358字符串循环节问题 ,next数组

    求字符串循环节,要求每前i个字符串前缀是否循环,有的话打印出来. 我对j=next[i]数组(未优化,从0开始,第一个为-1,)理解:字符s[i]的前面的字符串,最长的相同的前缀和后缀 的长度,因此, ...

  4. poj 3461 hash解法

    字符串hash https://blog.csdn.net/pengwill97/article/details/80879387 https://blog.csdn.net/chaiwenjun00 ...

  5. Ubuntu使用iptables配置防火墙提示:unrecognized service(Ubuntu配置iptables防火墙)

    Ubuntu默认安装是没有开启任何防火墙的. 当使用service iptables status时发现提示iptables:unrecoginzed service.意思是无法识别的服务. 以下方法 ...

  6. widows 2008 同步时间命令

    由于windows2008没有提供类似XP的自动同步功能,因此需要使用windows 2008计划任务来运行一行命令进行同步.   首先查看与想要同步时间的internet时间服务器的时差: w32t ...

  7. CSS - 如何实现强制不换行、自动换行、强制换行

    来源:http://www.cnblogs.com/mcat/p/4884644.html 强制不换行 div{ white-space:nowrap; } 自动换行 div{ word-wrap: ...

  8. Python学习系列之logging模块

    实例一:日志写进一个文件 代码: import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filen ...

  9. [MDX] Build a Custom Provider Component for MDX Deck

    MDX Deck is a great library for building slides using Markdown and JSX. Creating a custom Providerco ...

  10. Java 实现 淘宝秒杀 聚划算 自己主动提醒 源代码

    说明 本实例可以监控聚划算的抢购button,在聚划算整点聚的时间到达时自己主动弹开页面(URL自定义). 能够自己定义监控持续分钟数,同一时候还能够通过多线程加快刷新速度. 源代码 package ...