POJ 3230 Travel(最短路 狀壓DP)

2021-08-21 07:00:55 字數 2332 閱讀 4409

一張

n n

個節點

m' role="presentation" style="position: relative;">m

m條邊的圖,每個節點代表乙個城市,每條邊代表連線兩個城市,花費一定的路徑(雙向)。你選擇了

h h

個城市,現在要這些城市中打工。在第

i' role="presentation" style="position: relative;">i

i個城市打工可以賺 ci

c

i,但打工錢必須要花 di

d

i元錢拿到工作證,工只能打一次。剛開始你有

s s

元錢。問能否從節點

1' role="presentation" style="position: relative;">1

1出發並在節點

1 1

結束,並拿到指定的

h' role="presentation" style="position: relative;">h

h個城市的工作證? 1≤

n≤100 1≤n

≤100

1≤m≤5000

1 ≤m

≤5000

1≤s≤1000000

1 ≤s

≤1000000

1≤h≤15

1 ≤h

≤15

剛開始肯定要預處理出

n n

個城市互達的最短路。然後把

h' role="presentation" style="position: relative;">h

h個城市壓為下標進行狀壓dp

d

p。其中dp

i,j dpi

,j

儲存去過

i i

這些城市,人在

j' role="presentation" style="position: relative;">j

j號城市,手中最多可以持有多少錢。每次轉移只用列舉接下來去哪個城市即可,注意一開始先預處理出第乙個去的城市,求答案時要再回到第乙個城市,手中的錢數隨時都不能為負數。

#include

#include

#include

#include

#include

#include

#define for(i,x,y) for(int i=(x);i<=(y);i++)

#define dor(i,x,y) for(int i=(x);i>=(y);i--)

#define lowbit(x) ((x)&-(x))

#define tomax(a,b) (a=max(a,b))

#define tomin(a,b) (a=min(a,b))

typedef

long

long ll;

using

namespace

std;

int dp[(1

<<15)+3][18],bin[(1

<<15)+3];

int dis[103][103];

int pos[18],c[18],d[18];

int n,m,s,h;

int main()

for(k,1,n)for(i,1,n)for(j,1,n)tomin(dis[i][j],dis[i][k]+dis[j][k]);

for(i,1,n)for(j,1,n)if(dis[i][j]>1e9)dis[i][j]=-1;

scanf("%d",&h);

for(i,1,h)scanf("%d%d%d",&pos[i],&c[i],&d[i]);

memset(dp,-1,sizeof(dp));

for(i,1,h)if(~dis[1][i]&&s-dis[1][pos[i]]-d[i]>=0)dp[1

<1][i]=s-dis[1][pos[i]]-d[i]+c[i];

for(i,1,(1

<1)

for(int j=i;j;j^=lowbit(j))

for(int k=(~i)&(1

<1;k;k^=lowbit(k))

int ans=-1;

for(i,1,h)if(~dp[(1

<1][i]&&~dis[pos[i]][1])tomax(ans,dp[(1

<1][i]-dis[pos[i]][1]);

printf(~ans?"yes\n":"no\n");

}return

0;}

POJ 3230 Travel 動態規劃Dp

大致題意 有一位旅行者想在n個城市中旅行m天,旅行從乙個城市到另乙個城市需要一定的花費,到乙個城市又可以得到錢,但這個錢會隨著時間變化,現在求最大利潤。資料範圍n,m 100 很容易想到dp f i j 表示第i天到城市j的最大利潤 轉移方程 f i j max f i 1 k cost k j e...

HDU 2433 Travel 最短路樹

題意 給乙個n個點m條邊的無向圖 分別刪除每條邊 問刪除後的新圖中 分別以每個點為原點 到其它點的最短距離之和 圖不連通時輸出inf 思路 如果對於每一條邊刪除後都做n次最短路 則時間複雜度為o m n m log n 時間複雜度太高 仔細分析一下不難發現 只有刪除的邊是最短路樹上的邊 各點之間的最...

HDU 2433 Travel 最短路應用

題意 有n個點,m條邊,求依次刪除每一條邊後所有兩點之間的最短路徑的和。思路 先以每乙個頂點為源點求一遍最短路,這樣就形成了n個最短路樹,第i個樹的邊權和為sum i 然後列舉刪除每乙個邊,分別以邊上兩點u v為源點求最短路,如果u v的距離發生變化,則以u為源點時,v節點下的子樹的dis i 都會...