最短路算法
2021-04-10 23:26
标签:void tar make 循环 while class pop flag empty 1.图的初始条件[数组表示] 已知起点和终点的最短路 dijkstra 算法:选择最短边上的点直到所有点加入。【复杂度为NlogN+M ? 】 sfpa算法【适用于负权值边,最大复杂度为NM】【基于Bellman-Ford算法】 【bfs+队列】【出队遍历子点,子点满足条件则加入队列,循环直到队列为空,达到极值】 Floyd算法【用dis[N][N]存储最短距离,依次寻找路径点数为k的最短路径,遍历n次,即为最短距离】【是否有环路】 最短路算法 标签:void tar make 循环 while class pop flag empty 原文地址:https://www.cnblogs.com/nianyi/p/13363975.html//邻接表存储
int node[N];
struct Edge{
int to,next,value;
}edges[M];
int flag;
//矩阵存储
int dis[N][N];
int dis[N],vis[N];
priority_queueint> q;
//example:最短路径
int dis[N],vis[N];
priority_queue
int dis[N],vis[N];
queueint> q;
void sfpa(int start){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
//init
dis[start]=0;
vis[start]=1;
q.push(start);
while(!q.empty()){
int cn=q.front();
q.pop();
vis[cn]=0;
for(int e=node[cn];e;e=edges[e].next){
int sn=edges[e].to,value=edges[e].value;
if(dis[sn]>dis[cn]+value){
dis[sn]=dis[cn]+value;
if(!vis[sn])q.push(sn),vis[sn]=1;
}
}
}
}
void floyd(int n){
for(int k=1;k)//k指的是路径中包含前k个点
for(int i=1;i)
for(int j=1;j)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}