这个题目如果看清楚题意就很简单了,然而我还是出了一个非常讨厌的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; }