1447.最短路径(dijstra算法和floyd算法)

题目描述:

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的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 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
样例输出:
3
2

dijstra:
#include<stdio.h>
#include<vector>
using namespace std;
struct E{
    int next;
    int c;
};
vector<E> edge[101];
bool mark[101];
int dis[101];

int main(){
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
        if(n==0 && m==0) break;
        for(int i=1;i<=n;i++) edge[i].clear();
        while(n--){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            E temp;
            temp.c=c;
            temp.next=b;
            edge[a].push_back(temp);
            temp.next=a;
            edge[b].push_back(temp);
        }
        for(int i=1;i<=n;i++){
            dis[i]=-1;
            mark[i]=false;
        }
        dis[1]=0;
        mark[1]=true;
        int newp=1;
        for(int i=1;i<n;i++){
            for(int j=0;j<edge[newp].size();j++){
                int t=edge[newp][j].next;
                int c=edge[newp][j].c;
                if(mark[t]==true) continue;
                if(dis[t]==-1 || dis[t]>dis[newp]+c)
                dis[t]=dis[newp]+c;
            }
            int min=123123123;
            for(int j=1;j<=n;j++){
                if(mark[j]==true) continue;
                if(dis[j]==-1) continue;
                if(dis[j]<min){
                    min=dis[j];
                    newp=j;
                }
            }
            mark[newp]=true;
        }
        printf("%d\n",dis[n]);
    }
    return 0;
}

floyd:

#include<stdio.h>
int ans[101][101];
int main(){
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
        if(n==0 && m==0) break;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                ans[i][j]=-1;
            }
            ans[i][i]=0;
        }
        while(m--){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            ans[a][b]=ans[b][a]=c;
        }
        for(int k=1;k<=n;k++){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(ans[i][j]==1 ||ans[k][j]==-1) continue;
                    if(ans[i][j]==-1 || ans[i][k]+ans[k][j]<ans[i][j])
                    {
                        ans[i][j]=ans[i][k]+ans[k][j];
                    }
                }
            }
        }
        printf("%d\n",ans[1][n]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/bernieloveslife/p/9736492.html

时间: 2024-10-10 18:33:08

1447.最短路径(dijstra算法和floyd算法)的相关文章

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

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

最短路径—Dijkstra算法和Floyd算法

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算法

最短路径-Dijkstra算法和Floyd算法

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算法

最短路径—Dijkstra 算法和Floyd 算法

某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input本题目包含多组数据,请处理到文件结束. 每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目.城镇分别以0-N-1编号. 接下来是M行道路信息.每

Dijkstra算法和Floyd算法的正确性证明

说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正 ------------------------------------------- Dijkstra算法和Floyd算法用于求解连通图中任意两个顶点之间的最短路径 Dijksra算法从一个顶点v0出发,每次为一个顶点vi确定到达v0的最小路径 Dijkstra算法用distance[i]记录顶点vi到v0的最短路径,用pat

最短路径:Dijkstra算法和Floyd算法

最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径.算法具体的形式包括: 1.确定起点的最短路径问题:即已知起始结点,求最短路径的问题.适合使用Dijkstra算法. 2.确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题.在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题. 3.确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径. 4.全局最短路径

最短路径—大话Dijkstra算法和Floyd算法

Dijkstra算法 算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中.在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度.此外,每个顶点对应一个距离,S中的

Dijkstra算法和Floyd算法

一.简介 迪杰斯特拉(Dijkstra)算法和弗洛伊德(Flyod)算法均是用于求解有向图从一点到另外一个点最短路径. 二.Dijkstra 迪杰斯特拉算法也是图论中的明星算法,主要是其采用的动态规划思想,使其在数据结构.算法.离散数学乃至运筹学中都扮演重要的角色. 原文地址:https://www.cnblogs.com/lbrs/p/11986602.html

Dijkstra算法和Floyed算法

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