HDU 6331 Walking Plan
題意:n個點的圖,求s到t經過至少k條邊的最短路。
1<=n<=50 , 1<= k <=10000
設恰好經過k條邊的最短路為dis[k][i][j]
預處理很容易,但是TLE
發現dis[a+b][i][j] = min(dis[a][i][k] + dis[b][k][j])總是成立
發現預處理時間複雜度過大,處理詢問複雜度過小(O(1))
考慮把複雜度移到詢問上,分塊預處理,對於k%100==0存dis[k]
再對於k<100存dis[k]
這樣答案就是兩個dis合併,可以O(n)求答案,
對於至少這個要求再處理一下就行,細節有點。
#include<cstdio> #include<cstring> #include<cctype> #include<algorithm> #define maxn 55 #define LL long long using namespace std; int n,m; int dis[102][maxn][maxn],dist[102][maxn][maxn]; template<class T>inline void read(T &res) { char ch; for(;!isdigit(ch=getchar());); for(res=ch-'0';isdigit(ch=getchar());res=res*10+ch-'0'); } void solve(int d1[maxn][maxn],int d2[maxn][maxn],int d3[maxn][maxn]) { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d3[i][j] = min(d3[i][j] , d1[i][k] + d2[k][j] ); } int main() { int T; read(T); for(;T--;) { int u,v; int w; read(n),read(m); memset(dist,0x3f,sizeof dist); memset(dis,0x3f,sizeof dis); for(int i=1;i<=m;i++) { read(u),read(v),read(w); dis[1][u][v] = min(dis[1][u][v] , w); } for(int i=2;i<=101;i++) solve(dis[1],dis[i-1],dis[i]); memcpy(dist[1],dis[100],sizeof dis[100]); for(int i=2;i<=101;i++) solve(dist[1] , dist[i-1], dist[i]); for(int i=100;i>=0;i--) for(int x=1;x<=n;x++) for(int y=1;y<=n;y++) dis[i][x][y] = min(dis[i+1][x][y] , dis[i][x][y]), dist[i][x][y] = min(dist[i+1][x][y] , dist[i][x][y]); for(int i=1;i<=n;i++) dis[0][i][i] = dist[0][i][i] = 0; int q; read(q); for(;q--;) { read(u),read(v),read(w); int ans=0x3f3f3f3f,a = w / 100,b = w % 100; for(int i=1;i<=n;i++) ans=min(ans,min(dis[b][u][i] + dist[a][i][v] , dis[0][u][i] + dist[a+1][i][v])); if(ans==0x3f3f3f3f) ans = -1; printf("%d\n",ans); } } }
相關推薦
HDU 6331 Walking Plan
題意:n個點的圖,求s到t經過至少k條邊的最短路。 1<=n<=50 , 1<= k <=10000 設恰好經過k條邊的最短路為dis[k][i][j] 預處理很容易,但是TLE 發現dis[a+b][i][j] = min(dis[a][i]
HDU 6331 Walking Plan(分塊 動態規劃)
題意 給一個 nn 個節點 mm 條邊的有向圖,第 ii 條邊的兩個端點為 ui,viui,vi,邊的長度為 wiwi,qq 次詢問,每次詢問從節點 ss 到 tt 至少走過 kk 條路徑的最小距離。 輸入 第一行包含一個整數 T(1
[HDU 6331]Walking Plan
題解 #include<bits/stdc++.h> #define LL long long #define ull unsigned long long #define ULL ull #define mp make_pair #defin
HDU-6331 Problem M. Walking Plan(分塊+最短路)
Problem M. Walking Plan Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Total Submission(s): 169
2018多校第3場 M-Walking Plan && HDU6331 Problem M. Walking Plan
題意:給定一個 n 個點,m 條邊的有向圖,q 次詢問 s 到 t 經過至少 k 條邊的最短路 資料範圍:2 ≤ n ≤ 50,1 ≤ m,k ≤ 10000,1 ≤ q ≤ 100000 思路分析:分塊計算,k<=10000,把100條邊縮成一條邊。偷
HDU6331&&18多校3M Walking Plan 【分塊+DP】
Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Total Submission(s): 633 Accepted Submissi
Problem M. Walking Plan hdu6331(最短路)
Problem M. Walking Plan Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Total Submission(s)
hdu 4719 Oh My Holy FFF(dp線段樹優化)
origin end should adding href ast left code padding Oh My Holy FFF Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65535/65535
HDU 1087 Super Jumping! Jumping! Jumping!
blog col som oss score ++ all you finall Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU.
HDU 1114 Piggy-Bank(完全背包)
ask style span ica ace eno eterm ++ empty 題目: Before ACM can do anything, a budget must be prepared and the necessary financial support o
Hdu-1072
std bits -1 簡單 pty one int 個數字 一行 題目描述: 首先輸入一個N;代表測試數據的個數; 然後每個測試數據的開頭第一行輸入一個n和一個命令(FIFO或FILO<就是先進先出或先進後出>) 然後是該測試數據的n行,每行包括“IN”加一個
hdu 1284 錢幣兌換問題
print class mat 題目 能夠 ims 遞推 detail acm 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1284 思路:僅僅有3個硬幣,範圍是32768。能夠一個一個枚舉硬幣。假設僅僅放價值為1的硬幣
HDU 2648(搜索題,哈希表)
cin ostream pac cstring using mem == ring scan #include<iostream> #include<map> #include<string> #include<cstring&
hdu 5078
fine title tle only asi art it is text 現場 Osu! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) T
[luoguP2912] [USACO08OCT]牧場散步Pasture Walking(lca)
lose onclick event 傳送門 tdi iostream ace gif esp 傳送門 水題。 直接倍增求lca。 x到y的距離為dis[x] + dis[y] - 2 * dis[lca(x, y)] ——代碼
HDU 2112 HDU Today(STL MAP + Djistra)
stl eof dji int ble mes tin std n) 題目鏈接:HDU Today 立即集訓要開始,抓緊時間練練手,最短路的基礎題,第一次用STL的map 題目非常水,可是錯了N遍。手賤了。本題不優點理的就是把地名轉化為數字 #include
Super Jumping! Jumping! Jumping! HDU - 1087
std idt scribe cas abs roc assume led cor Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU
最大連續子序列 HDU - 1231
bsp 最大 程序 結構 %d col 最小 元素 class 給定K個整數的序列{ N1, N2, ..., NK },其任意連續子序列可表示為{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大連續子序列是所有連續子
三:搭建一個Web Test Plan
相同 order ng- use 原因 ear tps group add 參考:http://jmeter.apache.org/usermanual/build-web-test-plan.html 場景 5個用戶並發測試百度搜索,有兩個請求,一個請求搜索“你好”,一個
HDU 4930 Fighting the Landlords(扯淡模擬題)
href blank 。。 clear break 輸出 family fig set Fighting the Landlords 大意: 鬥地主。。。。 分別給出兩把手牌,肯定都合法。每張牌大小順序是Y (i.e. colored Joker) &g