呵呵

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));

  }

}
















  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值