【POI每日题解 #9】SKA-Piggy Banks
题意:
有一棵环套树
求最少从多少个节点出发能沿边走过整棵树
环套树 并查集求联通块
有几块就砸几个
太简单不发代码了
不过某大佬的环套树找环dfs让我研究了好久…
贴一下以Orz
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int MAXN=1000010; 5 int vis[MAXN],pa[MAXN]; 6 int n,ans; 7 inline void dfs(int x,int type) 8 { 9 if(type==1) 10 { 11 if(vis[x]==1) 12 { 13 ++ans;//新环 14 return; 15 } 16 else if(vis[x]==2)return;//在一个以前走过的块里 不统计 17 } 18 else 19 { 20 if(vis[x]==2)return; 21 } 22 vis[x]=type; 23 dfs(pa[x],type); 24 } 25 int main() 26 { 27 scanf("%d",&n); 28 for(int i=1;i<=n;++i) 29 { 30 scanf("%d",&pa[i]); 31 } 32 for(int i=1;i<=n;++i) 33 { 34 if(!vis[i]) 35 { 36 dfs(i,1);//检测是否为新环 37 dfs(i,2);//标记已统计的环 38 } 39 } 40 printf("%d",ans); 41 return 0; 42 }