zoukankan      html  css  js  c++  java
  • Flyod 算法(两两之间的最短路径)

    Flyod 算法(两两之间的最短路径)
    动态规划方法,通过相邻矩阵, 然后把最后的结果存在这么一个矩阵里面,(i,j),

    #include <iostream>

    #include <vector>

    using namespace std;

    #define M 301

    #define LIM 200000000

    int w[M][M],d[2][M][M];

     

    void floyd(int g[M][M],int d[2][M][M],int n){

                    int i,j,k;

                    for(i=1;i<=n;i++){

                                    for(j=1;j<=n;j++){

                                                    d[0][i][j]=g[i][j];

                                    }

                                    d[0][i][i]=0;

                    }        //这里是令d[0]=g

                    for(k=1;k<=n;k++){

                                    for(i=1;i<=n;i++)

                                                    for(j=1;j<=n;j++){

                                                                    int t1=k%2; int t2=(t1+1)%2;

                                                                    d[t1][i][j]=d[t2][i][j]< d[t2][i][k]+d[t2][k][j]?d[t2][i][j]:d[t2][i][k]+d[t2][k][j];

                                                    }

                    }

    }




    2. DijStra算法(单源节点算法,一个到其他定点所有的算法)

    #define M 101

    #define LIM 20000000

     

    int g[M][M],d[M],fd[2][M][M],gt[M][M],set[M];

    inline void init(int d[M],int n,int s){  //初始化图

                    int i;

                    for(i=1;i<=n;i++)    d[i]=LIM;

                    d[s]=0;

    }

     

    inline void relax(int d[M],int u,int v,int duv){

    if(d[v]>d[u]+duv)   d[v]=d[u]+duv;

    }

    void dijkstra(int g[M][M],int d[M],int n,int s){ //n is |V| && s is the source

                    init(d,n,s);

                    int q[M],ql=1,qf=1; //队列

                    int i;

                    for(i=1;i<=n;i++) q[ql++]=i;

                    while(qf!=ql){

                                    int min=qf;

                                    for(i=qf;i<ql;i++) if(d[q[i]]<d[q[min]]) min=i;

                                    swap(q[qf],q[min]); //q[qf] is the min

                                    int u=q[qf++];

                                    for(i=1;i<=n;i++){

                                                    if(g[u][i]!=0) relax(d,u,i,g[u][i]);

                                    }

                    }

    }





    3. BellmanFord算法
      g[][],是一个矩阵图,用于表达有向图 点之间的权重。

    inline void init(int d[M],int n,int s){  //初始化图

                    int i;

                    for(i=1;i<=n;i++)    d[i]=2000000000;

                    d[s]=0;

    }

     

    inline void relax(int d[M],int u,int v,int duv){

                    if(d[v]>d[u]+duv)   d[v]=d[u]+duv;

    }

     

    void bell_man(int g[M][M],int d[M],int n,int s){ //n个结点 s为源点

                    int i,j,k;

                    init(d,n,s);

                    for(k=1;k<n;k++){

                                    for(i=1;i<=n;i++)

                                                    for(j=1;j<=n;j++){

                                                                    if(g[i][j]!=0) relax(d,i,j,g[i][j]);

                                                    }

                    }

    }

  • 相关阅读:
    最简单的非交互ssh远程执行命令expect脚本
    [转]解决Adobe Reader X中金山词霸不能取词故障
    《TCP/IP Sockets 编程》笔记1
    Visual Studio 2005中无法调试CLR C++的枚举类型
    查找字符串中字符间不同的最大子串
    《C++ Primer》关于自增自减操作符的描述错误
    LVM逻辑卷管理
    《TCP/IP Sockets 编程》笔记2
    《TCP/IP Sockets 编程》笔记7
    Linux文件
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3216873.html
Copyright © 2011-2022 走看看