参照用ボードの若者のバージョンへのダイクストラの最短経路のみShenru

 

ダイクストラ最短パスアルゴリズムは、隣接行列で、一般的にアルゴリズムであり、n個の点で、時間計算量はO(N ^ 2)です。

ここでも、あなたはコメントを理解していない場合、私は無知、参照のみを目的として、このボードには比較的低い番号を使用し、それがより良いリファレンスを参照してくださいすることをお勧めします。

int n;
const long long inf = __LONG_LONG_MAX__;
struct NODE
{
  int u, v, next; // u、v两个点,next链式前向星要用
  long long w;    // 两点之间权值,必须是正数
} arr[10005];
int tot = 0;        // 链式前向星head[]的指针
int head[10005];
long long dist[10005];
void Init()
{
    tot = 0;    //初始化为零
    memset(arr, 0, sizeof(arr));
    memset(head, -1, sizeof(head));
    for(int i = 0; i < 10005; i ++)
    {
        dist[i] = inf;    // 起点到所有点初始距离都为无穷大,因为还没有路
    }
}
void add(int u, int v, long long w)
{
    arr[tot].u = u, arr[tot].v = v, arr[tot].w = w;  // 将两点和路权按输入顺序
    arr[tot].next = head[u];                         //压入链式前向星
    head[u] = tot;
    tot ++;
}
struct MYINT
{
    int num;   // 当前点的编号
    long long cost;
    friend bool operator<(const MYINT &a, const MYINT &b)
    {				           // 将对应结构体的sort或deque中<操作
        return a.cost > b.cost;//设置成这样
    }
    };
void bfs1()
{
    int vids[10005];     // 访问标记
    memset(vids, 0, sizeof(vids));
    MYINT be;
    be.num = 1, be.cost = 0;   // 从点1开始,cost不断记录到达新的num所需的距离
    priority_queue<MYINT>que;  // 最优路径情况下,花费较少的永远会被提到前面
    que.push(be);
    vids[be.num] = 1;    // 把起点自己先标记
    dist[be.num] = 0;    // 到自己距离为零
    while(!que.empty())
    {
        MYINT te = que.top();
        que.pop();
        vids[te.num] = 1;   // 走过的点标记为已访问
        for(int i = head[te.num]; ~i; i = arr[i].next)
        {
            MYINT en = te;
            en.num = arr[i].v;    //记录起点
            if(!vids[arr[i].v] && en.cost + arr[i].w <= dist[arr[i].v])
            {                     // 距离比原来更小, 就走走看
                en.cost += arr[i].w;
                dist[arr[i].v] = min(dist[arr[i].v], en.cost);
                que.push(en);
            }
        }
    }
}

チェーンの元スターの内部では、関連のブログを見に行くことができない、または私の後に補うために時間を見つけます。

公開された19元の記事 ウォンの賞賛0 ビュー512

おすすめ

転載: blog.csdn.net/qq_43317133/article/details/98185605