hdu2544

来源:互联网 发布:知行劳务 编辑:程序博客网 时间:2024/06/05 00:14

FLYOD算法

正如我们所知道的,Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3)。

Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX) + Dis(XB) < Dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置Dis(AB) = Dis(AX) + Dis(XB),这样一来,当我们遍历完所有节点X,Dis(AB)中记录的便是A到B的最短路径的距离。

for ( int i = 0; i < 节点个数; ++i ) {     for ( int j = 0; j < 节点个数; ++j )     {         for ( int k = 0; k < 节点个数; ++k )         {             if ( Dis[i][k] + Dis[k][j] < Dis[i][j] )             {                 // 找到更短路径                 Dis[i][j] = Dis[i][k] + Dis[k][j];             }         }     } } 

flyod 具体讲解

Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

 

Input
输入包括多组数据。每组数据第一行是两个整数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条商店到赛场的路线。
 

Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
 

Sample Input
2 11 2 33 31 2 52 3 53 1 20 0
 

Sample Output
32
 
#include <iostream>#include <cstdio>using namespace std;const int M = 10001;int map[M][M];int main(){    int n,m;    while(cin>>n>>m,n||m)    {        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)            map[i][j]=100000;        int a,b,c;        for(int i=1;i<=m;i++)        {            cin>>a>>b>>c;            if(map[a][b]>c)                map[a][b]=map[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(map[i][k]+map[k][j]<map[i][j])map[i][j]=map[i][k]+map[k][j];        cout<<map[1][n]<<endl;    }}




0 0
原创粉丝点击