单源最短路 Dijkstra O(mlogn) (类实现)

转载自 Felicia 的bolg
单源最短路 Dijkstra O(mlogn) (类实现)

#include  < iostream >
#include 
< vector >
#include 
< map >

#define  maxn 1010
using   namespace  std;
typedef 
double  weight;

class  graph_c
{
public:
    
void init(int _n);
    
void dijkstra(int S);
    
void add_edge(int u, int v, weight w);
private:
    
int n;
    vector 
<int> r[maxn];
    vector 
<weight> e[maxn];
    weight dist[maxn];
    
int pa[maxn];
    multimap 
<weight, int> h;
}
;

void  graph_c::init( int  _n)
{
    n 
= _n;
    
for (int i = 0; i < n; i++)
    
{
        r[i].clear();
        e[i].clear();
    }

}


void  graph_c::add_edge( int  u,  int  v, weight w)
{
    r[u].push_back(v);
    e[u].push_back(w);
}


void  graph_c::dijkstra( int  S)
{
    weight d, tmp;
    
int v;
    multimap
<weight, int>::iterator it;
    h.clear();
    
for (int i = 0; i < n; i++) dist[i] = -1;
    dist[S] 
= 0;
    pa[S] 
= -1;
    h.insert(multimap
<weight, int>::value_type(0, S));
    
while (!h.empty())
    
{
        it 
= h.begin();
        v 
= it->second;
        d 
= it->first;
        h.erase(it);
        
for (int i = 0; i < r[v].size(); i++)
        
{
            tmp 
= d + e[v][i];
            
int j = r[v][i];
            
if (dist[j] < 0 || tmp < dist[j])
            
{
                dist[j] 
= tmp;
                pa[j] 
= v;
                h.insert(multimap
<weight, int>::value_type(tmp, j));
            }

        }

    }

}
 

转载于:https://www.cnblogs.com/marsmars/archive/2008/02/18/2298980.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值