小豬存錢罐

2022-08-04 19:57:19 字數 1450 閱讀 5655

description

byteazar有 n 個小豬存錢罐. 每個存錢罐只能用鑰匙開啟或者砸開. byteazar已經把每個存錢罐的鑰匙放到了某

些存錢罐裡. byteazar 現在想買一台汽車於是要把所有的錢都取出來. 他想盡量少的打破存錢罐取出所有的錢,問

最少要打破多少個存錢罐.

input

第一行乙個整數 n (1 <= n <= 1.000.000)表示存錢罐的總數.

接下來每行乙個整數,第 i+1行的整數代表第i個存錢罐的鑰匙放置的存錢罐編號.

output

乙個整數表示最少打破多少個存錢罐.

sample input42

124sample output

2sol:兩種方法:1.強連通分量縮圈;2.並查集

方法一中樣例用有向圖表示為:

縮圈後有兩個入度為0的點,所以答案為2.

縮圈寫法:

1 #include2

#define ll long long

3#define n 1000005

4int

n,w,head[n],nxt[n],ans,size[n];

5int

to[n],cnt,dfn[n],st[n],r,k[n];

6int

low[n],tot,top,num[n];

7bool

vis[n];

8using

namespace

std;

9 inline void read(int &x)

12while(chchc>='

0'&&chchc<='9')

13 x=okoko?-datta:datta;14}

15 inline void link(int a,int b)

16 inline void t(int

x)25}26

if(dfn[x]==low[x])31}

32int

main()

並查集寫法:

1 #include2

using

namespace

std;

3int fa[1000001

],n,ans;

4bool flag[1000001];5

intget(intx)9

intmain()

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

1524}25

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

2633

}34 printf("%d"

,ans);

35return0;

36 }

1079 PIPI的存錢罐

這個問題的原型就是完全揹包問題模型,所不同的是完全揹包問題要求的是最大價值,而這個是最小價值 完全揹包問題的模型 是 for int i 1 i n i for int j c i j v j dp j max dp j c i w i dp j 明確了這個模型是完全揹包問題,我們再來確定初始狀態,...

1079 PIPI的存錢罐

題目描述 pipi有n種硬幣,每種硬幣有特定的重量wei i 克和它對應的價值val i 已知有乙個承重量為m的存錢罐,當裡面正好裝著重量為m的硬幣時,問你這個存錢罐中硬幣的最小價值是多少?如果不可能存在m克的情況,那麼就輸出 impossible 輸入 多組輸入。第一行包括兩個整數n,m 1 n ...