1   流程

    dist[所有点] = +∞
    dist[起始点] = 0

    小根堆
    存入起始点(倒存方便排序)

    while(堆不空)
    {
        取没走过的堆顶编号t
        st[t] == true
        用t更新其他所有出点(入堆)
    }

    判断是否能走

2   code

    int dijstra( int u )
    {
        memset( dist, INF, sizeof dist );
        dist[u] = 0;

        priority_queue< PII, vector<PII>, greater<PII> > heap;
        heap.push( { 0, u } );

        while( heap.size() )
        {
            int t = heap.top().second;
            heap.pop();
            if( st[t] )
                continue;

            st[t] = true;

            for( int i = h[t]; i; i = ne[i])
            {
                int y = e[i], z = w[i];
                if( dist[y] > dist[t] + z )
                {
                    dist[y] = dist[t] + z;
                    heap.push( { dist[y], y } );
                }

            }
        }

        if( dist[n] == 0x3f3f3f3f )
            return -1;
        else
            return dist[n];
    }