九度 1447 最短路径 (Floyd算法和 Dijstra算法)

题目:

给出点的个数N、边的个数M(N<=100,M<=10000),以及M条边(每条边有3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表A到B点的边权值为C)。求点1到点N的最短路径长。N=M=0表示输入结束。

Floyd算法:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <cstring>
 4 using namespace std;
 5 #define n 105
 6
 7 //邻接矩阵
 8 int ans[n][n];
 9
10 //主函数
11 int main(){
12     int N,M;
13     int A,B,C;
14     int i,j,k;
15                                         //输入N,M
16     while(scanf("%d %d",&N,&M)!=EOF && (N||M)){
17         memset(ans,-1,n*n*sizeof(int));       //初始化:主对角线为0,其余为-1
18         for(i=1;i<=N;i++)
19             ans[i][i]=0;
20
21         for(i=0;i<M;i++){                     //输入边值
22             scanf("%d %d %d",&A,&B,&C);
23             ans[A][B]=C;
24             ans[B][A]=C;
25         }
26         for(k=1;k<=N;k++){                    //Floyd算法
27             for(i=1;i<=N;i++){
28                 for(j=1;j<=N;j++){
29                     if(ans[i][k]==-1 || ans[k][j]==-1)//k的加入不会使之变短,跳过
30                         continue;
31                                                       //k的加入会使之变短,则替换
32                     if(ans[i][j]==-1 || (ans[i][k]+ans[k][j])<ans[i][j]){
33                         ans[i][j]=ans[i][k]+ans[k][j];
34                         ans[j][i]=ans[i][k]+ans[k][j];
35                     }
36                 }
37             }
38         }
39         printf("%d\n",ans[1][N]);             //输出最短路径
40     }
41     return 0;
42 }

Dijkstra算法:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <vector>
 4 #include <cstring>
 5 #include <climits>
 6 using namespace std;
 7 #define n 102
 8
 9 //边
10 struct Edge{
11     int node;     //边的一个点
12     int value;    //边的权值
13 };
14 //邻接链表
15 vector<Edge> edge[n];
16 //相关数组
17 int mark[n];    //若求出最短路径,为1;否则-1
18 int Dis[n];     //存最短路径,初始为-1
19 int path[n];    //存路径的前驱结点,初始为-1
20
21 //主函数
22 int main(){
23     int N,M;
24     int A,B,C;
25     int i,j;
26     int newP,oldP;
27     int nn,cc,min;
28     Edge ed;
29                                         //输入N,M
30     while(scanf("%d %d",&N,&M)!=EOF && (N||M)){
31         for(i=1;i<=N;i++){                    //清空动态数组
32             edge[i].clear();
33         }
34         memset(mark,-1,(N+1)*sizeof(int));    //初始化
35         memset(Dis,-1,(N+1)*sizeof(int));
36         memset(path,-1,(N+1)*sizeof(int));
37
38         for(i=0;i<M;i++){                     //输入边值
39             scanf("%d %d %d",&A,&B,&C);
40             ed.node=B;
41             ed.value=C;
42             edge[A].push_back(ed);
43             ed.node=A;                              //无向图,所以两边的边量表都要加
44             edge[B].push_back(ed);
45         }
46         mark[1]=1;                            //1为源点
47         Dis[1]=0;
48         path[1]=1;
49
50         newP=1;                               //当前已确定最短路径的点
51                                               //Dijkstra算法
52         for(i=0;i<N-1;i++){                   //循环N-1次即可得到答案
53             for(j=0;j<edge[newP].size();j++){       //遍历一条边链表
54                 nn=edge[newP][j].node;
55                 cc=edge[newP][j].value;
56                 if(mark[nn]==1)                           //该点已求出最短路径,跳过
57                     continue;
58                 if(Dis[nn]==-1 || (Dis[newP]+cc)<Dis[nn]){//路变短,则替换
59                     Dis[nn]=Dis[newP]+cc;
60                 }
61             }
62             min=INT_MAX;
63             for(j=1;j<=N;j++){                      //寻找mark[]为0中的Dis[]最小点
64                 if(mark[j]==1 || Dis[j]==-1)
65                     continue;
66                 if(Dis[j]<min){
67                     min=Dis[j];
68                     nn=j;
69                 }
70             }
71             oldP=newP;                              //该点成为新的newP
72             newP=nn;
73             mark[newP]=1;
74             path[newP]=oldP;
75         }
76
77         printf("%d\n",Dis[N]);                //输出最短路径
78     }
79     return 0;
80 }

***********************************************
对于二维矩阵,可直接当一维来初始化
int ans[2][2];
memset(ans,-1,4*sizeof(int));
***********************************************

时间: 2024-10-09 09:57:24

九度 1447 最短路径 (Floyd算法和 Dijstra算法)的相关文章

最短路-Floyd算法和Dijkstra算法

两者在负权问题上不是很好,最好只处理正值 Dijkstra算法的话,为了方便,我认为从i到i点不可达:百部百科解释挺好,那个堆优化挺好的 Floyd算法百部百科也不错,都是老算法了,哪都有资料 博客园这位筒子的写得很好 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Mathematica下的代码[我也觉得mathematica写很诡异...] (*Dijkstra算法,其思想和Prim有点像,输出的是每个点的

Dijkstra算法和Floyed算法

写的比较好的三篇文章 Floyed算法 最短路径-Dijkstra算法和Floyed算法 最短路径之Dijkstra算法和Floyed算法 哈哈,他山之石,可以攻玉 自己有心得,慢慢补充

最短路径Dijkstra算法和Floyd算法整理、

转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹

九度1008,最短路径问题

题目1008:最短路径问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5119 解决:1631 题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. 输入: 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p.最后一行是两个数 s,t;起点s,终点t.n和m为0时输入结束. (1<n<=1000, 0<

使用Apriori算法和FP-growth算法进行关联分析(Python版)

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

最小生成树-Prim算法和Kruskal算法

原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小.该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现:并在195

使用Apriori算法和FP-growth算法进行关联分析

系列文章:<机器学习>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章节标题所示,这两章讲了无监督机器学习方法中的关联分析问题.关联分析可以用于回答"哪些商品经常被同时购买?"之类的问题.书中举了一些关联分析的例子: 通过查看哪些商品经常在一起购买,可以帮助商店了解用户的购买行为.这种从数据海洋中抽取的知识可以用于商品定价.市场促销.存活管理等环节. 在美国国会

0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论

一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i件物品的重量是w[i],价值是v[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大.其中每种物品只有一件,可以选择放或者不放. 最优子结构性质:对于0-1问题,考虑重量至多W的最值钱的一包东西.如果去掉其中一个物品j,余下的必是除j以外的n-1件物品中,可以带走的重量

最小生成树(Prim算法和Kruskal算法)

1)最小生成树 给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树,那么这棵树就叫生成树.如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Minimum Spanning Tree) 2)应用 比如让你为一个镇的九个村庄架设通信网络,每个村庄相当于一个顶点,权值是村与村之间可通达的直线距离,要求你必须用最小的成本完成这次任务:或者村庄之间建公路,连通N个村庄要N-1条路,如何让建路成本最低之类的问题. 1.Prim算法 ①该算法是构建最小生成树的算法之一.它是