乙個國家有n個城市(標號為0~n-1),這n個城市恰好由n-1條道路連線在一起(即n個城市正好構成乙個樹狀結構)。這個國家的所有道路的長度都是1個長度單位。定義:兩個城市間的距離是兩個城市間的最短路的長度。
現在這個國家想建立一套定位系統,讓國家的公民能通過這套系統定位自己所在的城市。該系統由k個有編號的訊號站構成,不妨將它們標號為0,1,2,3,...,k-1。每個訊號站會放在乙個城市中,每個城市最多安放乙個訊號站,每個訊號站將不停的向外界傳送信。(值得注意的是,訊號站i不一定要安放在城市i中,例如:訊號站2可以放在城市3中,也可以放城市4中)對於乙個公民來說,如果他在城市x,那麼他開啟手機定位時,手機將收集k個訊號站的訊號,並根據這些資訊生成乙個k個元素的陣列dis,其中dis[i]記錄著訊號站i所在的城市與手機使用者所在的城市(這裡即為城市x)的距離。手機中的定位軟體將根據該dis陣列來判斷使用者所在的城市編號。
由於訊號站成本太高,該國家想盡可能少的購買訊號站,那麼問題來了,該國家最少需要安裝多少個訊號站才能唯一定位每乙個城市?
例如:這個國家有三個城市0,1,2,且鏈結關係為 0 -- 1 -- 2 (即0、1間有邊,1、2間有邊)。那麼只需要乙個基站就可以了。但是該基站需要放在城市0或城市2。如果放在城市0,那麼:
在城市0:dis = ;
在城市1:dis = ;
在城市2:dis = ;
顯然是可區分的。同理放在城市2中。
但是如果放在城市1中,三個城市的手機使用者會得到如下資料:
在城市0:dis = ;
在城市1:dis = ;
在城市2:dis = ;
顯然,城市0和城市2所獲得的dis資料相同,軟體顯然無法區分dis=時,使用者是在城市0呢?還是在城市2?所以該安放方法不是最佳的。
解題報告:
用時:2h,4wa
這題比較簡單,首先要明白葉子節點必須選,因為一對葉子節點,除非在兩者之間建立基站,其他不管在它們的爸爸媽媽爺爺奶奶處建立都沒有辦法區分他們兩個,所以只有二選一,但是還有乙個決策,記乙個點的葉子節點數為\(cnt\),那麼如果這個點沒有父節點,顯然只需要建立\(cnt-1\)個即可,那麼如果有父親節點,這個被獨立出來的葉子節點和他的父節點就無法區分,所以還需要決策,所以我們再列舉乙個根節點,並且強制根節點要選,那麼剩餘的這顆子樹就可和其區分開了,所以我們只需要保證每乙個節點的子樹中,只有乙個子樹沒有選即可,**簡短
#include #include #include #include #include #include #define rg register
#define il inline
#define iter iterator
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int n=55;
int head[n],nxt[n<<1],to[n<<1],num=0,n,f[n],tot=0,du[n];
char s[n];
void link(int x,int y)
void dfs(int x,int last)
if(cnt>1)tot+=cnt-1,f[x]=cnt-1;
}void work()
int ans=n;
for(int i=1;i} for(int i=1;i<=n;i++)
printf("%d\n",ans);
}int main()
51nod 1314 定位系統
乙個國家有n個城市 標號為0 n 1 這n個城市恰好由n 1條道路連線在一起 即n個城市正好構成乙個樹狀結構 這個國家的所有道路的長度都是1個長度單位。定義 兩個城市間的距離是兩個城市間的最短路的長度。現在這個國家想建立一套定位系統,讓國家的公民能通過這套系統定位自己所在的城市。該系統由k個有編號的...
51Nod 1491 黃金系統
acm模版 拿到這種題,不用多想,先列舉一些q i,可以發現在某種程度上其符合斐波那契數列 q 0用a表示,q 1用b表示,我們可以發現,每乙個數都可以用xa yb表示,而這裡的x和y在一定程度上都符合斐波那契數列。這也就給了我初始的想法,能否遍歷一遍,遇見連續兩位都是1的時候就減去這兩個1繼而在高...
黃金系統 51Nod 1419
可以發現q 3 q 2 q 就是個斐波那契數列 和之前做過的1946很像 於是就玄學暴力 各種t。看完題解 覺得很智障。既然是比較兩個數 直接處理兩數之差就好了 具體細節參考上面部落格 include using namespace std typedef long long ll const in...