luoguP2196 挖地雷 題解

2021-08-08 19:16:35 字數 1589 閱讀 2843

題目背景

noip1996提高組第三題

題目描述

在乙個地圖上有n個地窖(n<=20),每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑。當地窖及其連線的資料給出之後,某人可以從任一處開始挖地雷,然後可以沿著指出的連線往下挖(僅能選擇一條路徑),當無連線時挖地雷工作結束。設計乙個挖地雷的方案,使某人能挖到最多的地雷。

輸入輸出格式

輸入格式:

輸入檔案mine.in有若干行。

第1行只有乙個數字,表示地窖的個數n。

第2行有n個數,分別表示每個地窖中的地雷個數。

第3行至第n+1行表示地窖之間的連線情況:

第3行有n-1個數(0或1),表示第乙個地窖至第2個、第3個、…、第n個地窖有否路徑連線。如第3行為1 1 0 0 0 … 0,則表示第1個地窖至第2個地窖有路徑,至第3個地窖有路徑,至第4個地窖、第5個、…、第n個地窖沒有路徑。

第4行有n-2個數,表示第二個地窖至第3個、第4個、…、第n個地窖有否路徑連線。

第n+1行有1個數,表示第n-1個地窖至第n個地窖有否路徑連線。(為0表示沒有路徑,為1表示有路徑)。

輸出格式:

輸出檔案wdl.out有兩行資料。

第一行表示挖得最多地雷時的挖地雷的順序,各地窖序號間以乙個空格分隔,不得有多餘的空格。

第二行只有乙個數,表示能挖到的最多地雷數。

輸入輸出樣例

輸入樣例#1:

5 10 8 4 7 6

1 1 1 0

0 0 0

1 1

1 輸出樣例#1:

1 3 4 5

27這道題目有些圖論的味道,因為這些地窖它是選擇性連通的,我就用f[i][j]來設定乙個鄰接矩陣。對於a陣列,我們要存三個引數a[i][1]來儲存當前地窖有多少個地雷,a[i][2]來儲存通過這個地窖最多可以挖到多少個地雷,a[i][3]來儲存,如果要挖到最多的地雷,我們經過這個地窖之後要去哪個地窖。那麼這道題目就跟最長不下降序列有點像了。下面上**

#include

using

namespace

std;

int main()

for(int i=0;i<=209;i++)

for(int j=0;j<=209;j++)

f[i][j]=false;//鄰接矩陣的初始化,預設都不能通

int x=0;

for(int i=1;i<=n-1;i++)

for(int j=i+1;j<=n;j++)

for(int i=n-1;i>=1;i--)

if(nexthole>0)//如果更改過

}int ans=0;

int firsthole=0;

for(int i=1;i<=n;i++)

if(a[i][2]>ans)

//來尋找要挖到最多的地雷,第乙個對哪個地窖下手。

while(firsthole>0)//這裡跟鍊錶的遍歷有點像。真的太像了

//如果是0,就代表沒有後繼了

printf("\n%d",ans);//把路徑長度列印出來

return

0;}

題解 P2196 挖地雷

作為乙個剛剛接觸oi的蒟蒻,看到題目想都沒想就寫了乙個搜尋,列舉每乙個地窖作為起點再比較答案然後記錄下最優的,雖然此方法十分地暴力,但由於n 20所以仍然能ac的 include include include using namespace std const int maxn 20 int n,...

洛谷P2196 挖地雷

仔細看題 其實就是數塔問題的變種,多了乙個能否訪問的條件。所以就按照他的思路來就行了,多乙個way來儲存兩個地點是否能夠到達。關於選擇的輸出,用path陣列儲存前驅即可,include using namespace std const int nmax 25 int mine nmax int w...

洛谷P2196 挖地雷

題目鏈結 給你n個地窖和路徑,求最多能挖多少雷,和挖雷最多的路徑。第一行乙個整數n表示有n個地窖 第二行有n個整數表示每個地窖的地雷數 以下有若干行,每行有兩個數x,y表示x可以到y,保證x小於y。最後一行有兩個0,表示輸入結束 第一行輸出挖地雷的順序。第二行為最多挖出的地雷數 輸入 1 5 10 ...