1742. Team building(dfs)

本文介绍了一个基于图论的算法实现,主要关注如何通过深度优先搜索(DFS)来确定图中的连通块数量以及环的数量。该算法适用于无向图,并通过递归方式遍历每个节点,记录连通块及环的具体数目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1742

最小的是找联通块数 最大的找环 一个环算一个 其它的数各算一个

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 using namespace std;
 8 #define N 100010
 9 int fa[N],vis[N];
10 int minz,maxz,de[N],f[N],pp[N];
11 void dfs(int u,int v)
12 {
13     de[u] = v;
14     vis[u] = 1;
15     f[v] = u;
16     int i;
17     if(vis[fa[u]])
18     {
19         for(i = v; i >= 1 ; i--)
20         if(f[i]==fa[u])
21         break;
22         if(i>0)
23         maxz+=v-(de[u]-de[fa[u]]);
24         else
25         maxz+=v;
26         return ;
27     }
28     dfs(fa[u],v+1);
29 }
30 void dfs1(int u)
31 {
32     vis[u]=1;
33     if(!vis[fa[u]])
34     dfs1(fa[u]);
35     else
36     return ;
37 }
38 int main()
39 {
40     int i,n;
41     scanf("%d",&n);
42     for(i = 1; i <= n ; i++)
43     {
44         scanf("%d",&fa[i]);
45         pp[fa[i]] = 1;
46     }
47     for(i = 1; i <= n ;i++)
48     {
49         if(!vis[i]&&pp[i]==0)
50         {
51             minz++;
52             dfs(i,1);
53         }
54     }
55     for(i = 1; i <= n ; i++)
56     {
57         if(!vis[i])
58         {
59             minz++;
60             maxz++;
61             dfs1(i);
62         }
63     }
64     printf("%d %d\n",minz,maxz);
65     return 0;
66 }
View Code

 

转载于:https://www.cnblogs.com/shangyu/p/3362040.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值