題目傳送門:
題目大意是編號為1,2,3,4的四個點,1連4和2, 2連1和3,3連2和4,4連1和3,永遠從2號點出發回到2號點,要求跑的距離不小於k,問可以跑的最短距離是多少。
這裡有乙個trick,由於我們從二號點出發,最終又要回到二號點,因此對於一條從從二號點出發最終又回到二號點的路徑,我們可以從二號點出發,到一號點(或者三號點),然後再跑回二號點,這樣依然是一條從二號點出發最終回到二號點的路徑。也就是說,可以在一條合法路徑上再跑2的倍數次edge[2,1]或者edge[2,3]。
因此,選擇2 * edge[2,1]或者2 * edge[2,3]作為模數mod,記錄從2出發,到i號點且距離% mod 為m(0 <= m < mod)的最短路,再從終點為2的路徑中找出不小於k且最短的一條路。
稍微改一下spfa,維護佇列的時候不僅壓入節點同時壓入當前距離,因為鬆弛的時候不僅需要知道是從哪個點來的,還需要知道是從哪個模空間來的。
之前做過一道類似的題,現場卻沒a,還是菜
#include
#include
#include
#include
#include
using
namespace
std;
const
long
long inf = 0x3f3f3f3f3f3f3f3f;
const
int max = 3e4 * 2 + 10;
long
long k, dis[5][max];
int mod, d1, d2, d3, d4, g[5][5];
struct node
};void spfa()}}
}}int main()
else
}printf("%lld\n", ans);
}}
HDU 6071(同餘最短路)
給你四個點,相鄰兩個點之間有一條連邊。現在問你從 2 號點走到 2 號點的至少為 k 的最短路的長度。因為題目中的 k 比較大,因此一些亂搞的演算法顯然無法通過,而鑑於點數相對來說比較少,因此我們得研究一下這幾個點所蘊涵的性質。我們發現,對於 2 號結點,它有兩條可行的邊,我們設這兩條邊的距離分別為...
jzoj 6071 不同的縮寫 網路流
題目大意 給定n nn個字串,要求我們從每個字串中選出乙個子串行 可以不連續 要求每個選出的子串行都不同,並使得最長的最序列最短。要求輸出所求答案,並輸出一組可行解。n 300 n 300 n 30 0,每個字串長度不超過300.分析 對於每乙個字串來說,只有前n nn長的子串行有用,因為無論如何都...
hdoj 雜湊表題hdoj1425
github鏈結 include include using namespace std const int offset 500000 bool hash offset 500001 int main for int i offset 500001 i 0 n 0 i return0 這道題資料是...