Dijkstra算法适用范围是单源最短路,有向图或者无向图,不能处理负权值
Floyd算法适用多源最短路,有向图或者无向图,可以处理负权值但是不能处理负权回路
Ford 算法多源最短路,可以处理负权值,能检测负权回路
Leetcode 743. 网络延迟时间
先用Dijkstra算法解,输入是vector要转存一下,另外找的是最后一个传播到的节点所用时间

#define max 999999
#define CLR(donser,value) memset(donser,value,sizeof(donser))
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int N, int K)
{
int dis[N+1],map[N+1][N+1];
CLR(dis,max);
bool visit[N+1];
CLR (visit,false);
for(int i=1;i<=N;i++)//先初始化map
for(int j=1;j<=N;j++)
map[i][j]=max;
for(int i=0;i<times.size();i++)//把边转存到map
map[times[i][0]][times[i][1]]=times[i][2];
for(int i=1;i<=N;i++)//和起点直接相连的边
{
if(i==K)
dis[i]=0;
else
dis[i]=map[K][i];
}
visit[K]=true;//起点做标记
for(int i=1;i<=N;i++)//循环N次
{
int min=max,k;
for(int j=1;j<=N;j++)//找未加入visit的点所连最小边
{
if(!visit[j]&&min>dis[j])
min=dis[k=j];//k记录取到最小值时的下标
}
if(min==max)//不存在没加入的边了
break;
visit[k]=true;
for(int j=1;j<=N;j++)//给没有加入的边更新权值
{
if(!visit[j]&&dis[j]>dis[k]+map[k][j])//新加入了K,把与K相连的边加入
dis[j]=dis[k]+map[k][j];
}
}
int find=0;
for(int i=1;i<=N;i++)
if(dis[i]>find)
find=dis[i];
if(find==max)
return -1;
else
return find;
}
};
另外,Dijkstra算法模板:
#define N 101
#define max 999999
#define CLR(arr,what) memset(arr,what,sizeof(arr))
int nodenum,edgenum;
int map[N][N],dis[N];
bool visit[N];
int Dijkstra(int src,int des)//输入开始点和结束点
{
int temp,k;
CLR(visit,false);
for(int i=0;i<=nodenum;i++)//先把和开始点直接相连的边找出来
{
if(i==src)
dis[i]=0;//dis[i]存连入i的边,起始点赋0
else
dis[i]=map[src][i];
}
visit[src]=true;//起始点做标记
dis[src]=0;
for(int i=1;i<=nodenum;i++)//做i次循环
{
temp=max;
for(int j=1;j<=nodenum;j++)//寻找没有加入visit的节点中权值最小的
{
if(!visit[j]&&temp>dis[j])
temp=dis[k=j];
}
if(temp==max)//不存在没有加入的边时结束
break;
visit[k]=true;//访问标记
for(int j=1;j<=nodenum;j++)//加入k点以后更新和k相连的边
{
if(!visit[j]&&dis[j]>dis[k]+map[k][j])
dis[j]=dis[k]+map[k][j];
}
}
return dis[des];
}
来源:https://www.cnblogs.com/dzzy/p/12348705.html
