最短路 2 百度之星 初赛3

最短路 2

这个题目如果看清楚题意就很简单了,然而我还是出了一个非常讨厌的bug,找了半个多小时。

题目意思是给你一张图,求最短路,然后问你如果我要求出两点之间的最短路,那么最坏要枚举到第几个点。

比如说 1-4- 2 -5 我要求1到5的最短路,是不是要枚举到4 这个点才可以求出来。

然后我们就令d[1][5]=4   

这个因为n,m都比较小,所以可以之间跑n次最短路,然后每次跑的时候记录一下到这个点前的最大的点的序号。

我的bug在读入,读入的时候我只读了n条边,然后就不断的runtime error  应该要读m条边

書式#include <cstdioを> 
する#include <CStringの> 
の#include <cstdlib> 
書式#include <アルゴリズム> 
書式#include <キュー> 
の#include <ベクトル> 
の#include <iostreamの> 
の#include < 文字列 >
 に#define INF 0x3f3f3f3f
 の#define inf64 0x3f3f3f3f3f3f3f3f
 使用して 名前空間STD;
const  int型 MAXN = 1E5 + 10 const  int型のmod = 998244353 ; 
typedefの長い 長いLL。
LL D [MAXN]、NUM [MAXN]。
int型N、M。
BOOL VIS [MAXN]。
構造体のエッジ{ 
    LL から、に、DIST、NXT。
    エッジ(LL から = 0 =までLL、0、LL DIST = 0、LL NXT = 0からから)、(に)に、DIST(DIST)、NXT(NXT){} 
} EX [MAXN]。
構造体heapnode { 
    LL Dを、U。
    heapnode(LL D = 0、LL U = 0 ):D(D)、U(U){}
     ブール 演算子 <(CONST heapnode&A)のconst {
         リターン広告< D。
    } 
}。

LLヘッド[MAXN]、CNT = 0 

ボイドのinit(){ 
    memsetの(頭、 - 1はsizeof (ヘッド))。
    CNT = 0 ; 
} 

ボイド追加(LL U、LLをV、W LL){ 
    EX [CNT] = エッジ(U、V、W、ヘッド[U])。
    ヘッド[U] = CNT ++ 
    EX [CNT] = エッジ(W、V、U、ヘッド[V])。
    ヘッド[V] = CNT ++ 
} 

ボイドダイクストラ(int型の){ 
    PRIORITY_QUEUE <heapnode>QUE;
    しばらく(!que.empty())que.pop(); 
    memsetの(D、inf64、はsizeof (d)参照)。
    D [S] = 0、NUM [S] = 0 ; 
    memsetの(VIS、0はsizeof (VIS))。
    que.push(heapnode(0 、S))。
    一方、(!que.empty()){ 
        heapnode X = que.top()。que.pop(); 
        uはLL = 徐。
        もし(VIS [U])続けます
        VIS [U] = 1 以下のためのint型 i = head[u]; i != -1; i = ex[i].nxt) {
            edge &e = ex[i];

            if (d[e.to] == d[u] + e.dist) num[e.to] = min(num[e.to], max(num[u], u));
            if (d[e.to] > d[u] + e.dist) {
                d[e.to] = d[u] + e.dist;
                num[e.to] = max(num[u], u);
                if (u == s) num[e.to] = 0;
                que.push(heapnode(d[e.to], e.to));
            }
        }
    }
}


int main() {
    int t;
    scanf(" %のD "、&T)。
    一方、(t-- ){ 
        INIT()。
        scanf関数(" %d個の%のD "、&​​N、&M)。
        以下のためにint型 I = 1 ; I <= M; iは++ ){ 
            LL U、V、W。
            scanf関数(" %I64d%I64d%I64d "、およびuは、&​​V、およびW)
            (U、V、W)を加えます。
        } 
        LL ANS = 0 以下のためにint型 i = 1 ; iが++; iが<= N ){
            dijkstra(i);
            for (int j = 1; j <= n; j++) {
                ans += num[j];;
                ans %= mod;
            }
        }
        printf("%I64d\n", ans);
    }
    return 0;
}
View Code

 

おすすめ

転載: www.cnblogs.com/EchoZQN/p/11405015.html
おすすめ