您的位置:首页 > 其它

单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板

2015-05-19 09:58 495 查看
一:dijkstra算法
时间复杂度,用优先级队列优化的话,O((M+N)logN)
求单源最短路径,要求所有边的权值非负。若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。

设road[i][j]表示相邻的i到j的路长
U集合存储已经求得的到源点最短路径的节点,S集合表示还没求得的节点
dis[i]表示i到源节点(设为0)的最短路径
vis[i]=1表示i节点在U集合中

刚开始dis[0]=0,vis[0]=1;dis[i]=maxn,vis[i]=0;
for 1 to N:
1:从S集合中找出dis[]最小的节点i
将i从S中移出,插入到U中,即vis[i]=1;
2:遍历所有与i相邻的节点j
若dis[i]+road[i][j]<dis[j]
则dis[j]=dis[i]+road[i][j];
3:转1

//邻接链表存储——链式前向星
//head[i]:表示父亲节点i的所有指向子节点的最后一次与i连接的边的序号
//edge[k].next:表示编号为k的边的相邻的一条边的编号,这两条边是同一节点引出的
//edge[k].to:表示编号为k的边所指向的节点编号
//int head
,tot;
//n为顶点数,m为边数

struct edge
{
int next,to;
}edge[m]

void add(int x,int y)
{
edge[tot].next =head[x];
edge[tot].to = y;
head[x] = tot++;
}
//初始化
void init()
{
memset(head,-1,sizeof(head))
tot = 0;
}

//遍历与x相邻的所有点v
for(int k = head[x];k!=-1;k=edge[k].next)
{
int v = edge[k].to;
//...
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: