首页 > 代码库 > dijkstra算法
dijkstra算法
①先取一点v[0]作为起始点,初始化dis[i],d[i]的值为v[0]到其余点v[i]的距离w[0][i],如果直接相邻初始化为权值,否则初始化为无限大;
②将v[0]标记,vis[0] = 1(vis一开始初始化为0);
③找寻与v[0]相邻的最近点v[k],将v[k]点记录下来,v[k]与v[0]的距离记为min;
④把v[k]标记,vis[k]=1;
⑤查询并比较,让dis[j]与min+w[k][j]进行比较,判断是直接v[0]连接v[j]短,还是经过v[k]连接v[j]更短,即dis[j]=MIN(dis[j],min+w[k][j]);
⑥继续重复步骤③与步骤⑤,知道找出所有点为止。
题目
http://cogs.pro/cogs/problem/problem.php?pid=415
/**************************************************************************************************** 最短路—dijkstra算法(邻接表) 将边权替换为概率,相加改为相乘,最短距离改为最大概率 ********************************************************************************************************/#include<cstdio>#include<vector>#define MaxInt 99999999#define MaxN 10005#define eps 1e-8using namespace std;struct Edge{ int next,to; double power;}e[6*MaxN]; bool s[MaxN];// 判断是否已存入该点到S集合中double dis[MaxN];int n,m,ed[MaxN];void in(){ scanf("%d%d",&n,&m); int x; for(int i=1;i<=m;i++){ int j=i<<1; scanf("%d%d%lf",&x,&e[j].to,&e[j].power); e[j].power/=100; e[j].next=ed[x],ed[x]=j; if(x==1)dis[e[j].to]=e[j].power; j++; e[j].to=x;x=e[j-1].to,e[j].power=e[j-1].power; e[j].next=ed[x],ed[x]=j; if(x==1)dis[e[j].to]=e[j].power; }}void dijkstra(int v0){//v0为源点 s[v0]=1;dis[v0]=1; for(int i=1;i<n;i++){ double min1=0;int u=v0; for(int j=1;j<=n;j++){// 找出当前未使用的点j的dis[j]最小值 if(!s[j]&&dis[j]>min1+eps){ u=j;min1=dis[j];// u保存当前邻接点中距离最小(概率最大)的点的号码 } } s[u]=1; int x=ed[u]; while(x){//在通过新加入的u点路径找到离v0点更短的路径 if(dis[e[x].to]<dis[u]*e[x].power-eps)dis[e[x].to]=dis[u]*e[x].power;//更新dis x=e[x].next; } }}int perseverance(){ freopen("toura.in","r",stdin); freopen("toura.out","w",stdout); in(); dijkstra(1); printf("%.6lf",dis[n]*100);}int come_on=perseverance();int main(){ return 0;}
dijkstra算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。