zoukankan      html  css  js  c++  java
  • floyd

    求任意两点之间的最短路径。e[i][j]为记录从i到j之间的距离,当循环结束后最后存储的就是i到j之间的最短路径啦。

    floyd算法就是对于给定的n个结点,对于每一个e[i][j],都让它经过1,然后比较e[i][j]和e[i][1]+e[1][j]的大小,来更新e[i][j],再用2依次比较一下,同理,一直到n个结点都比较一次,所以就成了3层循环。但是我们要注意一下,floyd算法不适合带有负权值的问题,因为当存在负权值的时候就会一直循环下去,找不到最小值。而且效率有些低。。。。

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<string.h>
     5 using namespace std;
     6 const int inf=0x3f3f3f;
     7 int e[1004][1004];
     8 int main(){
     9 int m,n;
    10 while(cin>>n>>m){
    11         for(int i=1;i<=n;i++){
    12             for(int j=1;j<=n;j++){
    13                 if(i==j)e[i][j]=0;
    14                     else
    15                 e[i][j]=inf;
    16             }
    17         }
    18         int t1,t2,t3;
    19     for(int i=1;i<=m;i++){
    20         cin>>t1>>t2>>t3;
    21         e[t1][t2]=t3;
    22     }
    23     for(int k=1;k<=n;k++)///要经过的结点
    24     for(int i=1;i<=n;i++)
    25         for(int j=1;j<=n;j++)
    26             if(e[i][j]>e[i][k]+e[k][j])e[i][j]=e[i][k]+e[k][j];///更新结点
    27 for(int i=1;i<=n;i++){
    28     for(int j=1;j<=n;j++){
    29     printf("%10d",e[i][j]);
    30     }
    31     cout<<endl;}
    32 }
    33 }
    View Code
    你若盛开,清风自来...
  • 相关阅读:
    各种 SDk
    面试第一周
    KVC/KVO 的概述和使用
    How Many Tables HDU
    The Suspects POJ
    Wireless Network POJ
    Layout POJ
    The Shortest Path in Nya Graph HDU
    Extended Traffic LightOJ
    Tram POJ
  • 原文地址:https://www.cnblogs.com/shangjindexiaoqingnian/p/5866069.html
Copyright © 2011-2022 走看看