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 給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完...