ZOJ 2615 用棧模擬dfs

2021-07-02 20:37:36 字數 829 閱讀 6157

zoj 2615整整弄了兩天,雖然說題目意思很簡單,就是dfs。但是由於資料過大,不得不採取用棧去模擬dfs的方法,下面做一下總結

題目大意就是給你兩個數,詢問前乙個數是否為後乙個數的祖先,在做題過程中,由於查詢次數過多,所以借鑑了網上的思路,用出入棧次序去判斷。

**如下:

//基本思路:在模擬dfs過程中子節點的進棧一定晚於父節點,出棧一定早於父節點

#include#define maxm 20000005

#define maxn 300005

#pragma comment(linker,"/stack:1024000000,1024000000")

int num[maxn],child[maxn],now[maxn],n,m,top,my_stack[maxm],top_stack,in[maxm],out[maxm];//now用來記錄當前判斷的子節點,in,out用來記錄進棧出棧的次序

void my_dfs()//用棧模擬dfs

i=child[my_stack[top_stack]]+now[my_stack[top_stack]];

if(now[my_stack[top_stack]]==num[my_stack[top_stack]]&&top_stack==0)//判斷是否遍歷完

else if(now[my_stack[top_stack]]==num[my_stack[top_stack]])//判斷當前棧元素的子節點是否遍歷完想,遍歷完就出棧

else//入棧

}}bool query(int a,int b)

{ if(a>=b||a>=n||in[a]>in[b]||out[a]

用陣列模擬棧

用陣列模擬棧 棧是乙個先入後出 filo first in last out 的有序列表 允許插入和刪除的一端為變化的一端,稱為棧頂 top 另一端為固定的一端,稱為棧底 bottom public class arraystackdemo catch exception e break case ...

用棧模擬佇列和佇列模擬棧

棧 先進後出 filo 佇列 先進先出 fifo class myqueue 兩棧模擬佇列 def init self self.input self.output 進佇列 defpush self,x 出佇列 defpop self self.peek return self.output.pop...

拓撲排序(dfs用棧,bfs用佇列)

現在你總共有 n 門課需要選,記為 0 到 n 1。在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完...