记:

一开始没接触过关于最短距离的算法,便开始翻阅关于图的知识,

得知关于最短距离的算法有Dijkstra算法(堆优化暂未看懂),Bellman-Ford算法,Floyd算法,SPFA算法。

由于数据输入中存在负边,故可使用的有Dijkstra算法堆优化以及SPFA队列优化,

于是在网上找模版,却报出了运行错误。

也没看出问题,故翻阅他人笔记

其中一篇关于SPFA详解的blog:

http://blog.csdn.net/muxidreamtohit/article/details/7894298

让我恍然大悟,

然后就开始动笔...

第一次,10分  原因:没加结点的检查,造成死循环;

第二次,50分  原因:结点访问标记放在了判断最短距离的外面,造成了重复入队;

第三次,100分

源码如下:

 #include <stdio.h>
#include <stdlib.h>
#define MAX 99999999 typedef struct node node_t;
typedef struct node
{
int n ; /*指向的结点*/
int v ; /*边权值*/
node_t *next;
}node;
typedef node *node_p;
node_p *e = NULL; int *d; /*到各点的距离*/
int *vis; /*用于纪录各结点的访问记录*/
int *line; /*队列*/
int rear = , front = ; /*队列的首尾标志*/
int n = , m = ; /*n个结点,m条边*/ void init() /*初始化,以及各结点间距离的登记*/
{
node *p;
int i = , j = ;
int x = , y = , v = ;
scanf("%d %d",&n,&m); d = (int *)malloc(sizeof(int)*(n+));
vis = (int *)malloc(sizeof(int)*(n+));
line = (int *)malloc(sizeof(int)*(n+));
for (i = ; i <= n ; i ++)
{
d[i] = MAX;
vis[i] = ;
line[i] = ;
} e = (node_p *)malloc(sizeof(node_p)*(n+));
for (i = ; i <= n ; i ++)
{
e[i] = NULL;
} /*处理成邻接表*/
for (i = ; i <= m ; i ++)
{
scanf("%d %d %d",&x,&y,&v);
p = (node *)malloc(sizeof(node));
p->n = y ;
p->v = v ;
p->next = e[x];
e[x] = p;
} return ;
} void push(int x) /*进队列*/
{
front ++;
if (!line[front])
{
line[front] = x ;
}
if (front == n)
{
front = front%n;
}
return ;
} int pop() /*出队列*/
{
int x = ;
rear ++;
if (line[rear])
{
x = line[rear];
line[rear] = ;
}
if (rear == n)
{
rear = rear%n;
}
return x;
} void SPFA(int x)
{
node *p;
int i = , k = ; d[x] = ;
vis[x] = ; /*访问x并标记*/
push(x); /*进队*/
i = n;
while (i)
{
k = pop(); /*出队*/
vis[k] = ;
p = e[k];
i --;
while(p != NULL)
{
if (d[k]+p->v < d[p->n])
{
d[p->n] = d[k]+p->v; if (!vis[p->n])/*未被标记的下一个结点将进队*/
{
vis[p->n] = ;
push(p->n);
}
}
p = p->next;
}
} /*打印到各点的距离*/
for (i = ; i <= n ; i ++)
{
printf("%d\n",d[i]);
} return ;
} int main(void)
{
init();
SPFA();
return ;
}

ALGO-5_蓝桥杯_算法训练_最短路的更多相关文章

  1. [蓝桥杯]ALGO-20.算法训练_求先序排列

    问题描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=). 输入格式 两行,每行一个字符串,分别表示中序和后序排列 输出格式 一个字符串,表示所求 ...

  2. [蓝桥杯]ALGO-16.算法训练_进制转换

    问题描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*102+2*101+3*100这样 ...

  3. [蓝桥杯]ALGO-15.算法训练_旅行家的预算

    问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...

  4. [蓝桥杯]ALGO-124.算法训练_数字三角形

    问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●<三角形行数≤: ●三角 ...

  5. [蓝桥杯]ALGO-122.算法训练_未名湖边的烦恼

    问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩. 每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个.现在 ...

  6. [蓝桥杯]ALGO-116.算法训练_最大的算式

    问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号 ...

  7. [蓝桥杯]ALGO-101.算法训练_图形显示

    问题描述 编写一个程序,首先输入一个整数,例如5,然后在屏幕上显示如下的图形(5表示行数): * * * * * * * * * * * * * * * 题目描述 代码如下: #include < ...

  8. [蓝桥杯]ALGO-97.算法训练_排序

    题目描述: 问题描述 编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列. 输入格式:输入只有一行,即三个整数,中间用空格隔开. 输出格式:输出只有一行,即排序后的结果. 输入输出 ...

  9. [蓝桥杯]ALGO-92.算法训练_前缀表达式

    问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值.输入格式为:“运算符 对象1 对象2”,其中,运算符为“+”(加法).“-”(减法).“*”(乘法)或“/”(除法),运算对象为 ...

  10. [蓝桥杯]ALGO-90.算法训练_出现次数最多的整数

    问题描述 编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20.然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来.如果有两 ...

随机推荐

  1. SQL Server 调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)

    前言 本篇继续玩转模块的内容,关于索引在SQL Server的位置无须多言,本篇将分析如何利用Hint引导语句充分利用索引进行运行,同样,还是希望扎实掌握前面一系列的内容,才进入本模块的内容分析. 闲 ...

  2. LA3905

    题意: 给出n颗流星,第i颗在第T秒时飞到(xi+ai*t,yi+bi*t),给出一个矩形,问在某一时刻这个矩形中的流星数目最多有多少 题解: 首先计算出每一颗流星经过时间 然后左端点移动,计算出少了 ...

  3. apache2.4搭建php5.53问题总结

    1.如果Apache handler方式配置php,则最好选择Thread Safe,否则找不到php5apache2_4.dll.如果选择VC6版本以上的php,请到这里http://www.apa ...

  4. L1-031 到底是不是太胖了

    据说一个人的标准体重应该是其身高(单位:厘米)减去100.再乘以0.9所得到的公斤数.真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%). ...

  5. 借鉴seisman安装软件时的文件放置选择

    对于大型的软件包的安装来说: 当下载成功一个软件的压缩包后: tar -xvf xxxx.tgz ./configure --prefix=/opt/xxxx make sudo make insta ...

  6. SWIFT Optional Value

    SWIFT中有一个类型定义叫可选值,在变量类型后面加一个?号即可定义一个类型为Optional Value的变量,当在使用变量时要用到强制解包!. 如在页面上有一个可选输入年龄的框,在接受数据的时间就 ...

  7. flash存储原理

    norflash 带有 SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内容每一字节:nandflash器件使用复杂的IO口串行的存取数据,读写操作采用512字节的块(也就是读/写某个字节,必 ...

  8. python中几个实用的文件操作

    1. 判断指定目录是否存在: os.path.exists(input_folder) 2. 判断指定目录是不是文件夹 os.path.isdir(input_folder) 3. 判断指定目录是不是 ...

  9. 如何使用 python3 将RGB 图片转换为 灰度图

    首先,介绍第一种方法, 使用  PIL  库,   PIL库是一种python语言常用的一个图形处理库. 关于   PIL  库的安装本文就不介绍了. from PIL import Image I ...

  10. HDU 1233:还是畅通工程(最小生成树)

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...