題目前兩種是中讀到的。
我們肯定是想要把兩棵樹的最小表示找出來,然後看看是否相同。
在這種情況下,我們期望是每個點在其子樹內按最長鏈長度從大到小選擇子節點進行dfs,但是如果相同呢?我們就要在鏈上幹同樣的事情,理論上我認為記憶性搜尋應該可以到\(o(n^2)\),但我更認為我打不出這個**。
上一種方法的優化,就是直接把子節點的最小表示求出來,然後子節點的最小表示再按字典序拼起來,然後向上不斷合併,最小表示就出來了,最後判斷一下即可。
他們說是\(o(n^2)\),但是因為有排序,我又覺得不是\(o(n^2)\),應該會稍大一些,但是又卡不掉。(上面第一種也是如此。但是如果用類似基數排序的方法確實是\(o(n^2)\)的。)
我的思路就很暴力了。
\(pd(x,y)\)表示判斷\(x,y\)兩個子樹是不是一樣的,怎麼判斷呢?我們把\(x\)的子節點依次與\(y\)的子節點進行判斷,最後如果發現可以一一匹配的話,則返回\(1\),否則返回\(0\)。
但是時間複雜度如何證明?
很明顯,對於同一高度的兩個點最多進入\(pd\)一次,因為對於\(pd(x,y)\)而言,\(x\)的子節點\(a\)和\(y\)的子節點\(b\)只會\(pd\)一次,不管成功與否,**以後都不會再判斷\(pd(x,y)\)了,所以\(a,b\)也就只會互相\(pd\)一次。
利用這個,我們就可以得到時間複雜度:\(o(n^2)\)
暴力出奇蹟!!!!
#include#include#define n 6100
using namespace std;
struct node
a[n],b[n];int len,last[n],tot/*點的個數*/;
int n,fa[n],cnt[n];
void insa(int x,int y)
void insb(int x,int y)
char st[n];
int aa[n],bb[n];
int sta[n],top;//sta棧
int v[n],ts;
bool pd(int x,int y)}}
if(t==0)
}return 1;
}int main()
else cnt[fa[sta[top]]]+=cnt[sta[top]],top--;
}sta[top]=++tot;
for(int i=1;i<=n;i++)
else cnt[fa[sta[top]]]+=cnt[sta[top]],top--;
}if(pd(1,tot/2+1))printf("same\n");
else printf("different\n");
}return 0;
}
樹形地鐵系統
題目 前兩種是中讀到的。我們肯定是想要把兩棵樹的最小表示找出來,然後看看是否相同。在這種情況下,我們期望是每個點在其子樹內按最長鏈長度從大到小選擇子節點進行dfs,但是如果相同呢?我們就要在鏈上幹同樣的事情,理論上我認為記憶性搜尋應該可以到o n 2 o n 2 o n2 但我更認為我打不出這個 上...
《演算法競賽高階指南》樹形地鐵系統
一些主要城市擁有樹形的地鐵系統,即在任何一對車站之間,有且只有一種方式可以乘坐地鐵。此外,這些城市大多數都有乙個 車站。想象一下,你是一名在擁有樹形地鐵系統的城市遊玩的遊客,你想探索該城市完整的地鐵線路。你從 車站出發,隨機選擇一條地鐵線,然後乘坐地鐵行進。每次到達乙個車站,你都將選擇一條尚未乘坐過...
地鐵系統 誰在掌握地鐵訊號系統?
拍攝 蔡星卓 交控科技和眾合科技兩家公司去年中標線路幾乎佔據市場份額一半,因此營收取得較大增長。因訊號系統故障,列車出現延誤 行色匆匆的乘客或許在此時才會意識到複雜地鐵訊號系統的存在。訊號系統被稱為地鐵的大腦,是軌道交通行業的關鍵核心技術。訊號系統用於列車進路控制 列車間隔控制 排程指揮 資訊管理 ...