【floyd】HDU 1874 畅通工程续

之后的题解偏重实用/总结性质,尽量理解算法本身而不是题,时间复杂度什么的也可以放放。

很久之前做过这个题,当时使用dijkstra做的,关于几个最短路算法,分类的话可以分为以下几种。

1、单源最短路:已知起点(终点),计算从源点到其他各个顶点的最短路径长度。

典型算法:Dijkstra,Bellman-Ford(可以算负的,比较慢),spfa(负权能用,加了松弛操作,速度比较炸天)

2、全局最短路:从一点到另一点,典型如Floyd,A*启发式算法。

重新用floyd写一遍:

#include <iomanip>
#include <string.h>
#include <iostream>
using namespace std;

const int INF=0x3f3f3f3f;
int map[305][305];
int path[305][305];
bool visited[10005];
int prev[10005];
int waypoint;

void clearmap()
{
    for (int i=0;i<105;i++)
    {
        for (int j=0;j<105;j++)
        {
            map[i][j]=INF;
        }
    }
    memset(path,INF,sizeof(path));
    memset(prev,0,sizeof(prev));
    memset(visited,0,sizeof(visited));
}

void floyd()
{
	for(int k=0;k<waypoint;k++)
	{
		for(int i=0;i<waypoint;i++)
		{
			for(int j=0;j<waypoint;j++)
			{
				if(map[i][k]!=INF && map[k][j]!=INF)
				{
					if(map[i][j]>map[i][k]+map[k][j])
					{
							map[i][j]=map[i][k]+map[k][j];
					path[i][j]=path[k][j];
				}
				}
				
			
			}
		}
	}
}


int main()
{
    int route;
    while (cin>>waypoint>>route)
    {
       clearmap();
       for(int i=0;i<route;i++)
       {
               int a,b,dis;
               cin>>a>>b>>dis;
               if(map[a][b]>dis)
               {
               		map[a][b]=map[b][a]=dis;    
               }
           
       }
       floyd();
        int start,end;
        cin>>start>>end;
        
        if(start==end)
        {
        	cout<<0<<endl;
        }
        else if(map[start][end]!=INF)
            cout<<map[start][end]<<endl;
        else
            cout<<"-1"<<endl;


    }

    return 0;
}


你可能感兴趣的:(【floyd】HDU 1874 畅通工程续)