一道很典型的最短路径的题目。
算法的思想来自于Dijkstra(迪杰斯特拉)算法,大家在这里对这个算法就不介绍了。
可以在学完最短经的算法后,用这道题目当做练手。。我的算法还需要优化一下,代码也需要优化,因为我的代码确实有点乱。。下面的代码仅供参考。。
题目的链接:http://soj.me/1703
#include <iostream> #include <stdio.h> #include <string> #include <cstring> #include <queue> #include <set> #include <vector> using namespace std; int dis[130][130]; struct Gra { int r; int c; friend bool operator <(Gra g1, Gra g2) { if(dis[g1.r][g1.c] < dis[g2.r][g2.c]) return true; } }; int main() { int t; int count = 1; while (cin >> t && t != 0) { int s[130][130]; for (int i = 1; i <= t; ++ i) { for (int j = 1; j <= t; ++ j) { cin >> s[i][j]; } } set<Gra> q; int know[130][130]; memset(know, 0, sizeof(know)); memset(dis, 9999999, sizeof(dis)); Gra tu[16900]; tu[1].r = 1; tu[1].c = 1; q.insert(tu[1]); Gra temp; int i = 2; dis[1][1] = s[1][1]; set<Gra>::iterator it; set<Gra>::iterator itt; while (!q.empty()) { it = q.begin(); temp = *it; itt = it; ++ it; Gra tem; for (; it != q.end(); ++ it) { tem = *it; if (dis[temp.r][temp.c] > dis[tem.r][tem.c]) { temp = tem; itt = it; } } q.erase(itt); know[temp.r][temp.c] = 1; if (temp.r == t && temp.c == t) { cout << "Problem " << count << ": " << dis[temp.r][temp.c] << endl; break; } if (temp.c - 1 >= 1) { tu[i].c = temp.c - 1; tu[i].r = temp.r; if (know[tu[i].r][tu[i].c] == 0) { if (dis[tu[i].r][tu[i].c] > dis[temp.r][temp.c] + s[tu[i].r][tu[i].c]) { dis[tu[i].r][tu[i].c] = dis[temp.r][temp.c] + s[tu[i].r][tu[i].c]; q.insert(tu[i]); ++ i; } } } if (temp.r - 1 >= 1) { tu[i].r = temp.r - 1; tu[i].c = temp.c; if (know[tu[i].r][tu[i].c] == 0) { if (dis[tu[i].r][tu[i].c] > dis[temp.r][temp.c] + s[tu[i].r][tu[i].c]) { dis[tu[i].r][tu[i].c] = dis[temp.r][temp.c] + s[tu[i].r][tu[i].c]; q.insert(tu[i]); ++ i; } } } if (temp.c + 1 <= t) { tu[i].c = temp.c + 1; tu[i].r = temp.r; if (know[tu[i].r][tu[i].c] == 0) { if (dis[tu[i].r][tu[i].c] > dis[temp.r][temp.c] + s[tu[i].r][tu[i].c]) { dis[tu[i].r][tu[i].c] = dis[temp.r][temp.c] + s[tu[i].r][tu[i].c]; q.insert(tu[i]); ++ i; } } } if (temp.r + 1 <= t) { tu[i].r = temp.r + 1; tu[i].c = temp.c; if (know[tu[i].r][tu[i].c] == 0) { if (dis[tu[i].r][tu[i].c] > dis[temp.r][temp.c] + s[tu[i].r][tu[i].c]) { dis[tu[i].r][tu[i].c] = dis[temp.r][temp.c] + s[tu[i].r][tu[i].c]; q.insert(tu[i]); ++ i; } } } } ++ count; } //system("pause"); }
相关推荐
【标题】"sicily1294.rar_1294_sicily" 提供的信息表明,这可能是一个与中山大学ACM竞赛相关的代码压缩包,其中包含了对问题1294 "Sicily"的解决方案。在ACM(国际大学生程序设计竞赛,International Collegiate ...
sicily 1562_LVM.cpp参考代码
"CPP-for-sicily.zip_sicily"这个压缩包,显然是为了解决与"Sicily"相关的编程问题而准备的资源,它包含了一份名为"C++ for sicily.doc"的文档,这很可能是针对Sicily地区或某个特定的Sicily项目的一份C++解题模板...
"Sicily_Queue.rar_sicily"这个压缩包文件显然包含了与在Sicily平台上实现高效队列操作相关的代码或文档。 首先,我们需要理解队列的基本概念。队列就像一个等待服务的队伍,新进来的元素(入队)会排在队伍的末尾...
【标题】"sicily-1274.rar_sicily" 指向的是一个名为 "sicily-1274" 的RAR压缩文件,它包含的可能是一个关于 "sicily" 项目的源代码。RAR是一种流行的压缩格式,用于打包多个文件或文件夹到一个单一的、易于管理的...
在“sicily_source.zip_sicily”这个压缩包文件中,我们主要关注的是与西西里相关的编程练习,这些练习涵盖了输入输出操作和标准程序设计,同时也涉及到超高精度浮点数的输出问题以及关联数组这一数据结构。...
sicily-code.rar_1137_sicily 是一个压缩包文件,包含了中山大学某个项目或课程相关的代码。从描述中我们可以推断,这个项目或课程可能与 sicily 相关,而数字序列1137可能是课程编号、版本号或者是项目的特定标识。...
【 sicily-code--2.rar_sicily 知识点详解】 这个压缩包“sicily-code--2.rar_sicily”包含的是中山大学 sicily 项目的一系列参考代码,旨在帮助学习者理解和掌握 sicily 项目的具体实现。在这个压缩包中,我们可以...
【标题】"sicily-code--3.rar_sicily" 提供的是中山大学sicily课程相关的编程参考资料,这可能是一门涵盖计算机科学与信息技术的课程,其中涉及到的代码可能是用于教学或者项目实践。从描述来看,这个压缩包包含了...
【标题】"sicily-code--5.rar_sicily" 暗示了这是一个与 sicily 相关的代码项目,可能包含的是一个软件或游戏的源代码,版本号可能是5。"rar" 是一种常见的文件压缩格式,意味着这些代码被打包在RAR文件里。 【描述...
sicily-online-judge.zip_sicily 是一个与 Sicily 在线评判系统相关的压缩包,包含了一些编程题目和相应的解决方案。这些题目涵盖了不同的算法和数据结构主题,如线性表、最小生成树以及中缀转后缀表达式计算。以下...
标题中的"soj.rar_1876_sicily 1022_sicily 1934_sicily soj IP" 提到了几个关键元素,这些元素指向了一个编程竞赛或者作业集中的多个问题。"soj"通常代表"Software Judge",这是一个用于在线编程竞赛或教育平台的...
【 sicily 部分题目源代码 】 涉及到的是 sicily 平台上的算法题目解法,这些源代码已经过测试,确保能够正确运行并得出预期结果。在算法领域,编写源代码是解决问题的关键步骤,尤其是在 sicily 这样的在线编程平台...
通过对 sicily.doc 文件的深入研究,我们可以学习到实际编程中如何将理论知识应用于解决实际问题,同时也能提高我们的编程技巧和问题解决能力。无论是对初学者还是经验丰富的开发者,这样的资源都是宝贵的学习材料。
文件中还提到了“sicily1211.商人的宣传”,这可能是指与图论相关的一个编程题目,需要利用矩阵的幂运算来解决问题。这部分内容在文件中没有详细展开,但基于标题,我们可以知道这是一个关于编程平台上机考试的资料...
sicily AC代码指的是在编程竞赛或算法挑战中,参赛者提交并通过了评测系统的源代码集合。这个"112页的大礼包"很可能是一份综合性的编程资源,包含了多个不同的问题解决方案,涵盖了各种算法和数据结构的应用。从标签...
中大sicily online judge的刷题指南,里面介绍得很详细,不过,最近sicily好像不能外网访问了。
sicily-code--4.rar_17_951_815 是一个压缩包文件,其内容可能包含中山大学 sicily 项目相关的源代码。这个项目可能是为了研究或教学目的,涉及的时间范围从1350年到1815年,这可能暗示着它与历史、模拟或者数据分析...
本cpp是sicily的1006的解题代码 这份代码以最简单的方式实现了它的功能要求 值得学习一番