GDOI2003 刪邊 騎士問題

2021-10-02 06:18:12 字數 4361 閱讀 2037

刪邊刪邊

刪邊description

連通圖是指任意兩個頂點都有路徑可互相到達的圖。

讀入乙個無向的連通圖,輸出最多能刪掉多少條邊,使這個圖仍然連通。

input

第一行為圖的頂點數n(1<=n<=100)和邊數m,用乙個空格隔開,圖中的頂點用1到n的整數)編號。接下來的m行,每行用兩個數v1,v2表示一條邊。v1,v2用乙個空格隔開,表示這條邊所連線的頂點的編號(v1<>v2),同一條邊不會重複出現。

output

輸出最多能刪掉的邊數。

sample input

4 6

1 21 3

1 42 3

2 43 4

sample output

3
本人一眼最小生成樹,打崩了只有 75pts 。(我就是要打 prim !)

這題實際上很是簡單,只要考慮 n 和 m 就行了。

答案其實就是 m-(n-1),因為要使刪掉的邊最多,那麼只需要把給定的圖除一棵最小生成樹上的邊全部刪掉即可,如此一來剩下的邊一定是 n-1 條。

var n,m:longint;

begin

read

(n,m)

;write

(m-n+1)

;end.

騎士問

題騎士問題

騎士問題

description

在乙個標準 8*8 的西洋棋棋盤上,棋盤中有些格仔可能是有障礙物的。已知騎士的初始位置和目標位置,你的任務是計算騎士最少需要多少步可以從初始位置到達目標位置。有障礙物的格仔當然不可以到達。

標準的8*8的西洋棋中每乙個格仔可以用唯一的編號確定。行用1-8這8個數字依次表示,列用』a』-』h』這8個字母依次表示。例如左下圖的騎士所在位置(圖中有n的格仔)的編號為「d4」(注意『d』和『4』之間沒有空格)。   

我們知道西洋棋中的騎士可以按「l」路線移動(乙個方向走2個格仔,接著垂直方向走1個格仔)。因此,如左上圖中的騎士(位於d4),可以到達位置c2,b3,b5,c6,e6,f5,f3,e2(圖中有『x』標記的格仔)。此外,騎士不能夠移出棋盤。

騎士可以按照移動規則自由地在棋盤上沒有障礙物的格仔中移動。右上圖給出了乙個騎士移動的例子。初始格仔用『n』標記,目標格仔用『n』標記,有障礙物的格仔用『b』標記。乙個可行的移動序列在圖中用數字標記出來。(a1,b3,a5,c6,e5,g4,h2,f1)。總共需要7步才能完成。事實上,這也就是最小的步數了。

input

輸入檔案包括1個或多個測試資料。

每乙個測試資料的第一行是乙個整數b(-1<=b<=62),表示棋盤中有障礙物的格仔數目,當b=-1時,輸入檔案結束。

第二行含b個不同的障礙物的格仔編號,用空格隔開。當b=0時,此行為空行。

第三行是騎士的初始格仔和目標格仔的編號,也是用空格隔開。初始格仔和目標格仔是不同的,且都沒有障礙物。

output

對於每個資料,輸出一行。格式:board n: m moves,其中n表示資料的序號(從1開始)m表示騎士所用的最小的步數。

如果騎士無法到達目標格仔,輸出:board n: not reachable

sample input

10

c1 d1 d5 c2 c3 c4 d2 d3 d4 c5

a1 f1

0c1 b3

2b3 c2

a1 b2

-1

sample output

board 1: 7 moves

board 2: 1 moves

board 3: not reachable

爆力列舉 8 個位置 dfs 即可,判斷當前的步數是否比歷史的步數小來剪枝。

把讀入的字母預處理成數字會比較方便。

const go:array[

1..8,1.

.2] of longint=((

-2,-

1),(

-1,-

2),(

-2,1

),(-

1,2)

,(1,

-2),

(2,-

1),(

2,1)

,(1,

2));

var b,i,j,x,y,sx,sy,ex,ey,min:longint;

maze:array[

0..15,0.

.15] of boolean;

flag:array[

0..15,0.

.15] of longint;

ch:char

; s:string;

procedure search

(x,y,t:longint)

;var i,xx,yy:longint;

begin

if(t[y])

or(flag[x]

[y]=

0) then

begin

flag[x]

[y]:

=t; end

else

begin

exit;

end;

if(x=ex)

and(y=ey) then

begin

if tbegin

min:

=t; end;

exit;

end;

for i:

=1 to 8

do begin

xx:=x+go[i][1

];yy:

=y+go[i][2

];if(xx>0)

and(yy>0)

and(xx<=8)

and(yy<=8)

and(

not maze[xx]

[yy]

) then

begin

search

(xx,yy,t+1)

; end;

end;

end;

begin

repeat

readln

(b);

if b=

-1 then

begin

halt;

end;

j:=j+1

;fillchar

(maze,

sizeof

(maze),0

);readln

(s);

for i:

=1 to length

(s)do

begin

if s[i] in [

'a'.

.'h'

] then

begin

x:=ord

(s[i])-

96;end

else

if s[i] in [

'1'.

.'8'

] then

begin

y:=ord

(s[i])-

48;maze[x]

[y]:

=true

; end;

end;

readln

(s);

sx:=ord

(s[1])

-96; sy:

=ord

(s[2])

-48; ex:

=ord

(s[4])

-96; ey:

=ord

(s[5])

-48; min:

=$7fffffff

;fillchar

(flag,

sizeof

(flag),0

);search

(sx,sy,0)

;if min<

>

2147483647 then

begin

writeln

('board '

,j,': '

,min,

' moves');

endelse

begin

writeln

('board '

,j,': not reachable');

end;

until 0=1

;end.

然後就切掉啦)

GDOI模擬 排列

給你m個對1到n的排列的特徵,特徵有兩種 1 x y v 排列的第x個數到第y個數之間的最大值為v 2 x y v 排列的第x個數到第y個數之間的最小值為v 要求你還原出這個排列。刷水有益身心健康。既然是求方案,資料範圍又很小,那麼明顯的要用把點向權值連邊。然後他每次給出範圍之後再進行刪邊。最後,二...

GDOI模擬8 21總結

今天做了cqoi2013的題。第一次5個小時做5道題 先看了半小時的題。t5是初中做過的原題,記得是處理出上下界然後暴力列舉就行了,就先打了t5,花了乙個小時搞定了t5,過了樣例和自己出的幾個資料就沒管了 沒對拍是因為我覺得資料生成器有點難搞 然後這題做法本來就是暴力 然後去看了下之前沒怎麼看懂題的...

GDOI模擬2015 08 18 解密

給定一篇由若干個單詞構成的原文,還有乙個由若干個單詞組成的句子。加密文是由原文單詞通過某個單詞 可能一樣 替換而成的,原文相同單詞一定會被相同加密文單詞替換。沒有兩個不同的原文單詞被同乙個加密文單詞替換。要求找出句子在加密文中第一次出現的位置。原文本元總和不超過 1000000 句子字元總和不超過 ...