原題:
題意:
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,p2sp
→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...