【9007】最短路径
Time Limit: 1 second
Memory Limit: 256 MB
问题描述
给出一个有向图G=(V,E),和一个源点v0∈V,请写一个程序输出v0和图G中其他顶点的最短路径。只要所有的有向环都是正的,我们
就允许图的边有负值。顶点的标号从1到n(n为图G的顶点数)。
Input
第1行:一个正数n(2<=n<=80),表示图G的顶点总数。
第2行:一个整数,表示源点v0(V0∈V,V0可以是图G中任意一个顶点)。
第3至第n+2行,用一个邻接矩阵W给出了这个图。
Output
共包含n-1行,按照顶点编号从小到大的顺序,每行输出源点v0到一个顶点的最短距离。每行的具体格式参照样例。
Sample Input
5 1 0 2 - - 10 - 0 3 - 7 - - 0 4 - - - - 0 5 - - 6 - 0
Sample Output
(1->2)=2 (1->3)=5 (1->4)=9 (1->5)=9
【题解】
这题的数据超级坑的。。。他在每行的最后一个数字里面貌似会有多余的空格。。。。。、
说下思路。读取n行的字符串,整行读。
然后找到前n-1个空格。每个空格前面都是数字。然后再单独处理最后一个数字。。(有多余的空格要删掉).
如果遇到的字符不是-,就在i上面加一个出度,并记录这个出度为j。然后记下权值w[i][j]。然后如果为-,则不理它就好。
最后用spfa解决问题就可以啦。
【代码】
#include <cstdio>
#include <iostream>
#include <stdlib.h>
#include <string>using namespace std;int n,v0,a[100][100],team[200022];
long long w[100][100],dis[100];
bool exsit[100];void input_data()
{scanf("%d",&n);scanf("%d",&v0);getchar(); //用getline函数之前要先gechar用一下 for (int i = 1;i <= n;i++){int p;string ss;getline(cin,ss); //整行读入ss字符串当中 for (int j = 1;j <= n-1;j++) //获取前n-1个空格的位置,这个位置前的字符皆为数字 {p = ss.find(" ",0);long long x;bool flag = false;for (int k = 0;k <= p-1;k++) //如果不全为'-'号,则说明这是一个数字 if (ss[k] != '-'){flag = true;break; }if (flag && i!=j){x = atoll(ss.c_str()); //atoll函数在stdlib.h当中,要记住这是c函数,里面是string.c_str() a[i][0]++;a[i][a[i][0]] = j; //增加i的一个出度,并记录这个出度是j w[i][j] = x; //在i和j之间添加一条权值为x的边 } ss = ss.erase(0,p+1); //删掉已经扫描过的数字 }while ( ( p = ss.find(" ",0)) != -1) //“坑点” 要删掉多余的空格 ss = ss.erase(p,1);bool flag = false;for (int k = 0;k <= ss.size()-1;k++) //这是处理每行的最后一个数字 同上面的循环 if (ss[k]!='-'){flag = true;break; }if (flag){long long xx = atoll(ss.c_str());a[i][0]++;a[i][a[i][0]] = n;w[i][n] = xx; }}
}void spfa()
{ for (int i = 1;i <= n;i++)dis[i] = 999999999999999; //一开始起点到除自身外所有点的距离皆为正无穷。。 dis[v0] = 0; //起点是0 int head = 0,tail = 1;exsit[v0] = true;team[1] = v0; //把起点加入队列 并标记已经存在于队列中 while (head != tail){head++;int f = team[head]; //取出头结点 exsit[f] = false;for (int i = 1;i <= a[f][0];i++)//遍历它的出度 尝试更新最小值 {int t = a[f][i];if (dis[t] > dis[f] + w[f][t]) //如果能够更新最小值 就查看其是否在队列中,不在就加入队列 {dis[t] = dis[f] + w[f][t];if (!exsit[t]){exsit[t] = true;tail++;team[tail] = t;}}}}
}void output_ans()
{ for (int i = 1;i <= n;i++) //最后输出不是起点的dis值 if (i != v0)printf("(%d->%d)=%I64d\n",v0,i,dis[i]);
}int main()
{//freopen("F:\\rush.txt","r",stdin);input_data(); spfa();output_ans();return 0;
}
转载于:https://www.cnblogs.com/AWCXV/p/7632410.html
【9007】最短路径相关推荐
- Warshall算法多源点之间最短路径的算法最短距离
简介:Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系 ...
- 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...
问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...
- java找图最短路径_查找有向图最短路径
老师有一个题: 使用狄克斯屈拉(Dikjstra)标号算法可得出解: 我用Java来实现了一下这个算法: package test; import java.util.ArrayList; impor ...
- python迷宫问题求最短路径_用栈求解迷宫问题的所有路径及最短路径程序
目的:能将栈运用的更为熟练 实验内容:求解迷宫问题程序,要求输出如图所示的迷宫的路径,并求出第一条最短路径的长度以及最短路径. 设计的算法功能: mgpath(int xi,int yi,int xe ...
- Python访问街区所有节点最短路径问题,并结合matplotlib可视化
Python访问街区所有节点最短路径问题,并结合matplotlib可视化 1. 效果图 2. 源码 2.1 5个点全排列(递归+非递归算法) 2.2 python遍历全路径计算距离+matplot可 ...
- 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)
目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...
- oauth_client_details的值怎么添加_17.八年级数学:怎么求CDM周长的最小值?最短路径问题,经典考题...
欢迎您来到方老师数学课堂,请点击上方蓝色字体,关注方老师数学课堂.所有的视频内容,全部免费,请大家放心关注,放心订阅. 八年级数学:怎么求△CDM周长的最小值?最短路径问题,经典考题.大家先在草稿本上 ...
- NYOJ——街区最短路径问题
街区最短路径问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 一个街区有很多住户,街区的街道只能为东西.南北两种方向. 住户只可以沿着街道行走. 各个街道之间的间隔相 ...
- 图论-最短路径--3、SPFA算法O(kE)
SPFA算法O(kE) 主要思想是: 初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队.直到队列为空时算法结束. 这个算 ...
最新文章
- 如何迅速成为Java高手[Tomjava原创]
- 在IIS上部署基于django WEB框架的python网站应用
- MATLAB 未找到支持的编译器或 SDK。您可以安装免费提供的 MinGW-w64 C/C++ 编译器
- 若S作主串,P作模式串,试分别写出利用BF算法和KMP算法的匹配过程。
- CentOS系统下docker的安装与卸载
- Spring靴子战争包装
- CSS中文档流之普通流,浮动及定位、浮动特性及清除浮动的方式、定位模式,子绝父相搭配定位方式、z-index层级
- docker安装执行问题
- 页面滚动图片等元素动态加载实现本质
- 【图论】拉普拉斯矩阵(Laplacian matrix)
- cygwin中如何使用gcc
- 彻底搞懂 python 中文乱码问题_彻底搞懂 python 中文乱码问题(深入分析)
- c语言printf小数乘整数,如何将小数化为整数
- C++程序员应了解的那些事(19)C++ trivial(平凡的)和non-trivial(非平凡的)
- 关于Hibernate中调用集合类时出现的 the owning Session was closed 错误解决方案
- 法外狂徒——格雷福斯
- Mysql COUNT()条件计数
- 小说的逻辑与反逻辑_小说内部的逻辑与反逻辑
- python对数据集处理,绘制世界地图
- 2014年全球手游市场发展的六大趋势