Treasure Hunting(最短路 最大流)

2021-09-10 06:16:25 字數 2755 閱讀 3587

原題:

題意:

n* m的地圖,上面有『#』(不能走),『.』(可以走),『*』(寶藏)和字母。有兩個人小a和小b,兩人都會從地圖a出發,小a會從a開始按順序走到b,c…z,a,b…z,一直走到最後乙個單詞為止,即如果只有abc就走到c,如果只有abd那麼就不合法,每次都走最短路。小b也會按小a的速度走最短路(即同時到達下乙個點),但是他可以走不同的路線,如果路線上有寶藏,他就會挖寶藏,但是從乙個字母走到另乙個字母的過程中他只能挖乙個寶藏。

如果過程不合法請輸出-1,如果合法,請輸出小b最多可以獲得多少個寶藏。

解析:

先排-1的情況有:

只有abde

出現aabc

a走不到b

做一遍最短路。對於乙個寶藏點p,第i個目標點x

ix_i

xi​,如果dis

(p,x

i)+d

is(p

,xi+

1)==

dis(

xi,x

i+1)

dis(p,x_i)+dis(p,x_)==dis(x_i,x_)

dis(p,

xi​)

+dis

(p,x

i+1​

)==d

is(x

i​,x

i+1​

),則說明可以在x

ix_i

xi​到xi+

1x_

xi+1

​的途中拿到。

建圖:將x

ix_i

xi​到xi+

1x_

xi+1

​這條路看成乙個點x

ix_i

xi​;寶藏點p因為只能被採一次,所以裂點p1,

p2

p_1,p_2

p1​,p2​sp

→xi,

xi→p

1,p1

→p2,

p2→e

psp\to x_i,x_i\to p_1,p_1\to p_2,p_2\to ep

sp→xi​

,xi​

→p1​

,p1​

→p2​

,p2​

→ep

#include

using namespace std;

#define pill pair

#define ll long long

const

int inf =

0x3f3f3f3f

;const

int n =

20500

, m =

205000

;int head[n]

, nex[m]

, to[m]

, val[m]

, now;

void

add(

int a,

int b,

int v)

//*********************

int sp, ep, d[n]

;int

bfs()}

}return d[ep]!=-

1;}int

dfs(

int p,

int v)}if

(!r)

d[p]=-

2;return r;

}ll dinic()

return ans;

}//***********************

void

init()

const

int di[4]

[2]=

,,,}

;char mp[

101]

[101];

int n, m;

intid

(int x,

int y)

pill pos[60]

;int up;

int dis[60]

[10100];

bool vis[

10100];

void

get_dis()

}for

(int i =

1; i <= up; i++)}

}}}int

build()

for(

int i =

1; i <= n; i++)}

}}intmain()

, up =

max(up, mp[i]

[j]-

'a'+1)

;else

pos[mp[i]

[j]-

'a'+27]

=, up =

max(up, mp[i]

[j]-

'a'+27)

; mp[i]

[j]=

'.';}}

if(co != up)

bool f =1;

for(

int i =

1; i <= up; i++)if

(!f)

get_dis()

;if(build()

==-1)

int ans =

dinic()

;printf

("%d\n"

, ans);}

}

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

最短路(最短路之積)

首先考慮暴力維護,顯然極端資料就會炸裂,那麼用什麼來維護呢?考慮乙個很 nb的公式log n m log n log m ok,這道題到此結束 我們只要把乘積轉化為對數,最後再還原就可以了,也不用考慮精度問題,本蒟蒻試著用pow,然後它死了。includeusing namespace std co...