2018 8 11T1(貪心,基環樹)

2021-08-22 16:37:25 字數 1973 閱讀 9539

描述

有 n 座城市,其中編號為 1 的是首都。

城市之間只能通過單向的傳送器進行移動。每座城市有且僅有乙個傳送器,第 i 個城市的傳送器指向城市 ai。保證從任意城市出發,經過若干次傳送,都能到達首都。

小a喜歡 k 這個數,他想讓你修改一些城市的傳送器,使得從每個城市出發,走恰好 k 步後都能恰好停在首都。

求最少需要修改多少個城市的傳送器。

輸入格式

第一行兩個數 n, k。

第二行 n 個數 a1~an,表示每個城市初始的傳送器指向的城市編號。

輸出格式

一行乙個數,表示最少需要修改多少個城市的傳送器。

樣例1

樣例輸入1

3 1

2 3 1

樣例輸出1

2樣例2

樣例輸入2

8 2

5 4 2 1 1 7 2 4

樣例輸出2

3仔細觀察你會發現,題目繞來繞去,就是給了你乙個樹形結構

不過這是乙個奇環內向樹

實際上是單個環

當然如果你足夠優秀,你會直接發現1必須連自己,然後你隨便給每個節點重新定父親,問最少需要給幾個節點重新定父親

實際上我們只要貪心的做就行了

很多人的做法是從上往下搜,把k+

1,2k

+1,3

k+1 k+1

,2k+

1,3k

+1

層全部改掉

實際上這樣是錯的,不是最優的

要從下往上搜

為什麼?

實際上抽象的想,從上往下相當於把從上往下選擇的層向上移若干層。

那移動之後的點數肯定比移動前的點數要少。

故從下往上搜肯定比從上往下搜更優

#include

using

namespace

std;

#define rep(i,j,k) for(int i = j;i <= k;++i)

#define repp(i,j,k) for(int i = j;i >= k;--i)

#define ll long long

int n , k;

int a[100100] , fa[100100] , hash[100100];

struct deepdep[100100];

vector

g[100100];

bool flag[100100];

int read()

while( c >= '0' && c <= '9' ) sum = sum * 10 + c - 48 , c = getchar();

if(flag) return sum;

else

return -sum;

} queue

q;void print1()

void change(int x)

q.pop();

}return;

}bool mycmp(deep a,deep b)

int solve1()

if(a[1] != 1) sum++;

return sum;

}void init()

if(k == 1) print1();

q.push(1);

while(q.size())

q.pop();

}rep(i,1,n) dep[i].id = i;

printf("%d\n",solve1());

return;

}int main()

二分貪心 T

題目 有1 1,2 2,3 3,4 4,5 5,6 6大小的盒子,要把它們裝到6 6的盒子裡,它們的高度都是相同的,用最少的6 6盒子把所有尺寸的盒子都裝起來。解題思路 6 6,5 5以及4 4尺寸的物品每個物品需要占有乙個箱子,3 3的物品乙個箱子可以放4個,2 2的物品箱子可以放9個,1 1的可...

D班集訓day1t2 道路分組(貪心)

比較簡單的一道題。因為分組必須連續,故可以直接貪心。能加則加,不能加則不加,更新可以用類似於增廣的思想去做 include using namespace std define rep i,j,k for int i j i k i define repp i,j,k for int i j i k...

演算法 貪心(1)

今天實驗做的是貪心演算法,中午睡醒然後爬了九樓去實驗室,討厭,老師沒有提前發實驗指導書剛開始還是討厭的,因為以前都是提前做好直接過來驗收的,畢竟對自己還是很沒有信心能夠在實驗課上完成實驗的 哎,事實證明確實沒有完成,思路想法都是有的,就是不會用高階語言實現了,難受難受 說正事吧,貪心演算法,就是目光...