1. 程式人生 > >HDU 6331 Walking Plan

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