最短路径:
floyd 求的是 任意两点之间最短路径的算法。时间复杂度O(N^3);
for(int k = 1; k<=m; k++) {
for(int i=1; i<=m; i++) {
for(int j=1; j<=m; j++) {
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
}
Dijstra算法求的是一个顶点到其他各个顶点之间最短路径。
void dij(int s) { //dis[i]表示源点到点 i 的距离
int sum=0;
memset(vis,0,sizeof(vis));
for(int i=1; i<=m; i++) {
dis[i]=map[s][i];
} //更新当前源点到其他点的距离
dis[s]=0; //当前出发点设为0
int minn,temp;
for(int i=1; i<m; i++) {
minn = max;
for(int j=1; j<=m; j++) {
if(!vis[j] && dis[j] < minn) { //找到最小的值
minn=dis[j];
temp = j;
}
}
vis[temp] = true;
for(int j=1; j<=m; j++) {
if(!vis[j] && dis[j]>dis[temp]+map[temp][j]) //如果通过点temp到达点j更短的话,就更新
dis[j]= dis[temp]+map[temp][j];
}
}
}
SPFA同样是求一个顶点到其余各个顶点的最短路径,但它相较于Dijstra算法而言可以判断是否有负环。
spfa存储图的信息是利用链式前向星来存储
int SPFA(int s) {
memset(vis,0,sizeof(vis));
memset(dis,maxx,sizeof(dis));
dis[s]=0;
memset(in,0,sizeof(in));
queue<int>q;
q.push(s); //当前起点加入队列
vis[s]=true;
while(!q.empty()) {
int x = q.front(); //起点
q.pop();
vis[x]=false;
for(int i=head[x]; i; i=edge[i].next) {
int temp = edge[i].to; //表示边 i 指向的终点
if(dis[temp] > dis[x]+edge[i].w) {
dis[temp] = dis[x]+edge[i].w;
// printf("dis[ %d ]: %d\n",temp,dis[temp]);
if(!vis[temp]) {
q.push(temp);
vis[temp]=true;
if(++in[temp]>m) //如果一个点进入的次数大于n,那么就可以判断存在负环
return false;
}
}
}
}
return true;
}