最短路

*Floyd--Warshall

求任意两点间的最短路算法

它的核心算法就只有五行

for(k=1;k<=n;k++)
       for(i=1;i<=n;i++)
          for(j=1;j<=n;j++)
             if(e[i][j]>e[i][k]+e[k][j]&&e[i][k]<inf&&e[k][j]<inf)
                e[i][j]=e[i][k]+e[k][j];

该算法for循环较多,时间复杂度为0(N^3),数据稍大则会超时,有局限性。

*Dijkstra--单源最短路

指定一个点到其余各顶点的最短路径。

    for(i=1;i<=n-1;i++)
    {
        min=inf;
        for(j=1;j<=n;j++)
        {
            if(book[j]==0&&dis[j]<min)
            {
                min=dis[j];
                u=j;
            }
        }
        book[u]=1;
        for(v=1;v<=n;v++)
        {
            if(e[u][v]<inf)
            {
                if(dis[v]>dis[u]+e[u][v])
                   dis[v]=dis[u]+e[u][v];
            }
        }
    }

该算法时间复杂度为O(N^2),

*Bellman-Ford----解决负边权

核心代码

	for(k=1;k<=n-1;k++)
		for(i=1;i<=n;i++)
		{
			if(dis[v[i]]>dis[u[i]]+w[i])
			{
				dis[v[i]]=dis[u[i]]+w[i];
			}
		}

  与Dijkstra思想有相同之处。

 

 

 菜鸟先写个大概吧

posted @ 2019-04-04 15:36  蓉~  阅读(146)  评论(0编辑  收藏  举报