【1】SPFA算法
void spfa(){
memset(vis,0,sizeof(vis));
memset(dis,120,sizeof(dis));
queue<int>q;
q.push(s);
dis[s]=0,vis[s]=true;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=true;
for(int i=1;i<=n;i++)
if(dis[i]>dis[u]+edge[u][i]){
dis[i]=dis[u]+edge[u][i];
if(!vis[i]){
vis[i]=true;
q.push(i);
}
}
}
}
【2】Dijkstra算法
void dijkstra(){
memset(dis,120,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[1]=0;
for(int i=1;i<=N;i++){
int mark=-1,mindis=INF;
for(int j=1;j<=N;j++)
if(!vis[j]&&dist[j]<mindis){
mindis=dist[j];
mark=j;
}
vis[mark]=1;
for(int j=1;j<=N;j++)
if(!vis[j]) dist[j]=min(dist[j],dist[mark]+g[mark][j]);
}
}
【3】Floyd算法
void floyd(){
memset(dis,120,sizeof(dis));
//add dis[i][j] && dis[j][i]
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j&&i!=k&&j!=k&&dis[i][k]+dis[k][j]<dis[i][j]) dis[i][j]=dis[i][k]+dis[k][j];
}
【4】Bellman-Ford算法
暂缺