码迷,mamicode.com
首页 > 编程语言 > 详细

dijkstra算法

时间:2017-04-18 11:08:51      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:邻接表   最大   scanf   span   pac   oid   struct   str   min   

 

①先取一点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-8
using 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算法

标签:邻接表   最大   scanf   span   pac   oid   struct   str   min   

原文地址:http://www.cnblogs.com/bennettz/p/6726719.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!