九度OJ-1447:最短路
来源:互联网 发布:2017淘宝女装网红店 编辑:程序博客网 时间:2024/05/07 22:05
本题是用Dijkstra算法求最短路径的第一题。使用了一个mark[]来实现已确定集合与未确定集合的区分,使用一个dist[]来存储目前的最短路径,使用newPoint存储上一趟选中的已确定结点。将Dijkstra算法用代码语言实现一遍即可。
需要注意的是,初始时需要将出发结点x作为newPoint并将x加入已确定集合来初始化。
debug过程:
①粗心将
for (i++;i<graph.graphSize;i++){if (mark[i]==false&&dist[i]!=-1&&dist[i]<dist[minDistVex])minDistVex=i;} newPoint=minDistVex;mark[minDistVex]=true;中的
newPoint=minDistVex;mark[minDistVex]=true;写到了for的里头。这样带来的问题是导致当进行Dijkstra的最后一趟时,for会直接被跳过一次都不执行,从而使这两句语句也一次不执行,于是便出现问题。
- 题目描述:
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
- 输入:
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。输入保证至少存在1条商店到赛场的路线。
当输入为两个0时,输入结束。
- 输出:
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间。
- 样例输入:
2 11 2 33 31 2 52 3 53 1 20 0
- 样例输出:
32
#include <iostream>#include <vector>#include <iomanip>#define MAXSIZE 200 using namespace std;struct Edge{int start,end;double weight;Edge(){}Edge(int start,int end,double weight){this->start=start;this->end=end;this->weight=weight;}}; struct Vex{int root;Vex(){//initiate rootthis->root=-1;} };struct Graph{ //顶点下标从0开始 int graphSize;vector<Edge> edge[MAXSIZE];vector<Vex> vex;int initGraph(int graphSize){this->graphSize=graphSize;for (int i=0;i<graphSize;i++)edge[i].clear();vex.clear();}};int main(){int n,m,x;Graph graph;int start,end,weight;bool mark[MAXSIZE];int dist[MAXSIZE];int newPoint,minDistVex;int temp;while (cin>>n>>m,n||m){//n vexes ,m edges//initiategraph.initGraph(n);newPoint=0;for (int i=0;i<graph.graphSize;i++){mark[i]=false;dist[i]=65000;}mark[newPoint]=true;dist[newPoint]=0;//input edgefor (int i=0;i<m;i++){cin>>start>>end>>weight;start--;end--;graph.edge[start].push_back(Edge(start,end,weight));graph.edge[end].push_back(Edge(end,start,weight));}//processfor (int time=0;time<n-1;time++){//每趟循环找出x到一个结点的最短路径,共n-1趟 //遍历newPoint直接相邻的结点,修改其distfor (int i=0;i<graph.edge[newPoint].size();i++){temp=dist[newPoint]+graph.edge[newPoint][i].weight;if (temp<dist[graph.edge[newPoint][i].end]) //if the new dist< the old distdist[graph.edge[newPoint][i].end]=temp;}//遍历dist,从mark为false的结点中找出其dist最小的结点,确定为新的newPoint,并加入x集合 int i;for (i=0;i<graph.graphSize;i++){//initiate minDistVexif (mark[i]==false){minDistVex=i;break;}}for (i++;i<graph.graphSize;i++){if (mark[i]==false&&dist[i]<dist[minDistVex])minDistVex=i;} newPoint=minDistVex;mark[minDistVex]=true;} //outputcout<<dist[n-1]<<endl;}return true;}
0 0
- 九度oj 题目1447:最短路
- 九度OJ-1447:最短路
- 九度OJ题目1447:最短路
- 九度OJ-1447:最短路(Floyd)
- 九度OJ——1447最短路
- 九度OJ 1100:最短路
- 九度OJ 1447 最短路 1008 最短路径问题
- 九度OJ 1341:艾薇儿的演唱会 (最短路)
- 九度oj-1343-城际公路网【最短路】
- 九度题目1447:最短路
- 九度题目1447:最短路
- 九度OJ 1008:最短路径问题 (最短路)
- 九度1008最短路
- 九度 OJ 1162 I Wanna Go Home 最短路问题
- 九度OJ 1402(计数) 1403(模拟) 1404(未完成) 1405(未完成) 1406(最短路)
- 九度OJ 1407(线段树) 1408(DP) 1409(DP) 1410(DP) 1411(最短路)
- 九度OJ-题目1447-最短路径-floyd-dijisitra
- [九度OJ]最短路径
- 监督学习-朴素贝叶斯算法模板
- OSI模型中完整7层定义
- sudo apt-get install libopencv-dev 遇到ppa获取错误的问题
- HDU 1002:A + B Problem II
- android gridLayout
- 九度OJ-1447:最短路
- python逐行读取文件内容的三种方法
- c++第二节之this指针
- oop思想的封装、继承、多态
- 观察者模式
- PDB文件:每个开发人员都必须知道的
- ubuntu预装脚本
- 欢迎使用CSDN-markdown编辑器
- PAT甲级1111