這道題是個好題,至少我第一下沒有想到是乙個古老的演算法:$floyd$
第一眼知道是個最短路,然後就很果斷的寫了$dijkstra$,對於每組輸入求一遍最短路,發現時間很困難。又該寫了$spfa$。當時認為$spfa$在新加入村莊時只需將其鬆弛操作即可。
後來發現超時,$80pts$。
事實上在維護新加入的村莊時計算最短路,$floyd$在這方面很出色。$floyd$滿足三角不等式,即$i$到$j$借助新加入的村莊$k$進行維護,而且只需$o(n^2)$
綜上,複雜度為$o(n^3)$。
1 #include 2 #include 3 #include 4 #include 56using
namespace
std;78
#define re register
9#define rep(i, a, b) for (re int i = a; i <= b; ++i)
10#define repd(i, a, b) for (re int i = a; i >= b; --i)
11#define maxx(a, b) a = max(a, b);
12#define minn(a, b) a = min(a, b);
13#define ll long long
14#define inf (1 << 30)
1516 inline int
read()
2223
const
int maxn = 200 + 5;24
25int
dis[maxn][maxn], n, m, q, t[maxn];
2627
intmain()
3839 q =read();
4041
int k = 0;42
43 rep(kase, 1
, q)
51if (t[x] > t || t[y] > t || dis[x][y] == 1061109567) printf("
-1\n");
52else printf("
%d\n
", dis[x][y]);53}
5455
return0;
56 }
洛谷 P1119 災後重建
題目背景 b地區在 過後,所有村莊都造成了一定的損毀,而這場 卻沒對公路造成什麼影響。但是在村莊重建好之前,所有與未重建完成的村莊的公路均無法通車。換句話說,只有連線著兩個重建完成的村莊的公路才能通車,只能到達重建完成的村莊。題目描述 給出b地區的村莊數n,村莊編號從0到n 1,和所有m條公路的長度...
洛谷 P1119 災後重建
題目背景 b地區在 過後,所有村莊都造成了一定的損毀,而這場 卻沒對公路造成什麼影響。但是在村莊重建好之前,所有與未重建完成的村莊的公路均無法通車。換句話說,只有連線著兩個重建完成的村莊的公路才能通車,只能到達重建完成的村莊。題目描述 給出b地區的村莊數n,村莊編號從0到n 1,和所有m條公路的長度...
洛谷 P1119 災後重建
題目背景 b地區在 過後,所有村莊都造成了一定的損毀,而這場 卻沒對公路造成什麼影響。但是在村莊重建好之前,所有與未重建完成的村莊的公路均無法通車。換句話說,只有連線著兩個重建完成的村莊的公路才能通車,只能到達重建完成的村莊。題目描述 給出b地區的村莊數n,村莊編號從0到n 1,和所有m條公路的長度...