51nod 1314 定位系統

2021-08-21 21:21:46 字數 2030 閱讀 2397

乙個國家有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?所以該安放方法不是最佳的。

input

第一行,乙個整數n表示城市的數量(1<=n<=50)

接下來會有乙個由『y』『n』兩個字元構成的n*n矩陣link,表示城市的鏈結情況。

對於矩陣中某個元素link[i][j]=='y'表示城市i與城市j間有一條無向邊,否則為『n』表示沒有邊。

output

一行乙個整數k,表示該城市最少需要多少個訊號站才能實現每個城市的唯一定位。
input示例

4

nyyy

ynnn

ynnn

ynnn

output示例

2
思路:

樹形dp。依次嘗試在每乙個點放置乙個基站,同時在每乙個葉子節點放置乙個基站,因為這樣在該點和葉子節點能解決該路徑上所有的節點,即貪心演算法。

同時如果該節點的某乙個分支是單鏈的話,那麼這個分支上已經由該節點解決,所以不需要在葉子節點放置基站。如果有多個分支是單鏈,那只能有乙個分支的葉子節點不需要放置基站。

#include #include #include #include using namespace std;

const int maxn = 1010;

int f[maxn], t[maxn];

char s[maxn];

struct edge

a[maxn];

int n, tot = 0;

void addedge(int from, int to)

void dfs(int now, int father)

else

dfs(peer, now);

f[now] += f[peer];

if (t[peer] <= 1)

else}}

if (t[now] >= 2)

else if (!t[now]) }

int main()

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

int ans = 1 << 30;

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

printf("%d",ans);

return 0;

}

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...