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