首页 > 代码库 > hdu 2544 最短路 解题报告
hdu 2544 最短路 解题报告
题目链接: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 了
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 using namespace std; 6 7 #define INF 100000000 8 const int maxn = 100 + 10; 9 int dist[maxn], map[maxn][maxn], vis[maxn]; 10 int n, m; 11 12 void Init() 13 { 14 int i, j, st, en, cost; 15 for (i = 1; i <= n; i++) 16 dist[i] = (i == 1 ? 0 : INF); 17 memset(vis, 0, sizeof(vis)); 18 for (i = 1; i <= n; i++) 19 { 20 for (j = 1; j <= n; j++) 21 map[i][j] = INF; // 这样也行:map[i][j] = map[j][i] = (i == j ? 0 : INF); 22 } 23 for (i = 1; i <= m; i++) 24 { 25 scanf("%d%d%d", &st, &en, &cost); 26 map[st][en] = map[en][st] = cost; // 建立邻接矩阵 27 } 28 } 29 30 void Dijkstra() 31 { 32 int i, j, k, mini; 33 for (i = 1; i <= n; i++) 34 { 35 mini = INF; 36 for (j = 1; j <= n; j++) // 这个循环是用来找出与第i个点最近的点(当然是直接有边相连) 37 { 38 if (!vis[j] && dist[j] < mini) 39 { 40 mini = dist[j]; 41 k = j; 42 } 43 } 44 vis[k] = 1; // 如果把这句放在上面的if里面,就会把有些不该被标记已经过的点置1了,实质只需要置距离i点最短的那个点 45 for (j = 1; j <= n; j++) 46 { 47 if (dist[j] > mini + map[k][j]) // mini其实就是dist[k],mini + map[k][j]表示绕过k点走到j点的路径会不会比直接不绕过k要短 48 dist[j] = mini + map[k][j]; // dist[j] = dist[k]+ map[k][j; 49 } 50 } 51 } 52 53 int main() 54 { 55 while(scanf("%d%d", &n, &m) && (m || n)) 56 { 57 Init(); 58 Dijkstra(); 59 printf("%d\n", dist[n]); 60 } 61 return 0; 62 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。