dijkstra
1.dijkstra
求单源点最短路
实现 :贪心策略,不断加点
申明:
struct edge{
int v,next,jia;} e[];//链表存边 jia--权值
int dis[...];在当前状态下到各点距离
int vis[...];
代码:
暴力版:
memset(dis,inf,sizeof(dis));
dis[s]=0; //s起点
for (int i=1;i<n;i++) /*n--点数*/{
int minn=inf,mi;//每次循环找最短的点来松弛与他相连的点
for(int j=1;j<=n;j++)
if (!vis[j] && dis[j]<minn) {
minn=dis[j]; mi=j;}
vis[mi]=1;
for (int j=head[mi];j!=-1;j=e[j].next)
if (dis[e[j].v]>e[j].jia+dis[u])dis[e[j].v]=dis[mi]+e[j].jia;//由于是每次找最小的更新所以
}
优先队列优化:
typedef pair<int,int> pil;
priority_queue <pil,vector<pil>,greater<pil> >q;
memset(dis,inf,sizeof(dis));
dis[s]=0;
q.push(make_pair(0,s));
while(!q.empty())
{
int u=q.top();
q.pop();
if (vis[u]) continue;
vis[u]=1;
for (int i=head[u];i!=-1;i=e[i].next) if(dis[e[i].v]>dis[u]+e[i].v)
{
dis[e[i].v]=dis[u]+e[i].v;
q.push(make_pair(dis[e[i].v],i));
}
}