dijkstra(最短路径)

来源:互联网 发布:苏州德威国际学校 知乎 编辑:程序博客网 时间:2024/05/16 09:27

//不带堆优化版本,1为源点

int dijkstra(){    int ans = 0;    for(int i = 1; i <= n; i++)  vis[i] = 0,dis[i] = inf;    dis[1] = 0;    for(int i = 1; i <= n; i++)    {        int temp = inf,u;        for(int j = 1; j <= n; j++)    //每次找离源点最近的点(未被访问过)        {            if(vis[j]) continue;            if(temp > dis[j]) temp = dis[j],u = j;        }        vis[u] = 1;        for(int j = 0; j < g[u].size(); j++)//松弛它能松弛的        {            int v = g[u][j].to;            if(vis[v]) continue;            if(dis[v] > dis[u] + g[u][j].w)    //松弛操作                dis[v] = dis[u] + g[u][j].w;        }    }    printf("%d\n",dis[n]);    return 0;}

//带堆优化版本 0为源点

#define inf = 0x3f3f3f3f;struct node{    int to,w;    node(){}    node(int a,int c){to = a; w = c ;}    bool operator < (const node temp)const    {return w > temp.w;}};int vis[maxn], dis[maxn];vector <node> g[maxn];int dijkstra(){    priority_queue<node> pq;    pq.push(node(0,0));    for(int i = 0; i < n ; i++)        vis[i] = 0,dis[i] = inf;    dis[0] = 0;    while(!pq.empty())    {        node temp = pq.top(); pq.pop();//堆顶元素是离源点最近的那一个        int u = temp.to;        if(vis[u]) continue;        vis[u]=1;        for(int i = 0; i < g[u].size(); i++)//松弛找到的这个点能松弛的所有距离        {            int v = g[u][i].to,w = g[u][i].w;            if(dis[v] > dis[u] + w) //松弛操作            {                dis[v] = dis[u] + w;                pq.push(node(dis[v],v));            }        }    }}
原创粉丝点击