【正经题解】信息传递
2024-03-15 11:32:44
发布于:浙江
55阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[110];
// 读入宏,用于简化输入操作
template<typename T>
inline void read(T &x){
x=0;
char c=getchar();
bool f=0;
while(!isdigit(c)){
if(c=='-'){
f=1;
}
c=getchar();
}
while(isdigit(c)){
x=(x<<3)+(x<<1)+(c^'0');
c=getchar();
}
if(f){
x=~(x-1);
}
}
// 输出宏,用于简化输出操作
inline void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9){
write(x/10);
}
putchar(x%10+'0');
}
// 将数字转换为字符串
inline string intToString(int x){
stringstream ss;
string s;
ss << x;
ss >> s;
return s;
}
// 将字符串转换为数字
inline int stringToInt(string s){
stringstream ss;
int x;
ss << s;
ss >> x;
return x;
}
#define pc(x) putchar(x)
#define wtl(x) write(x),pc('\n')
#define kg pc(' ')
#define hh pc('\n')
#define lb(x) x&-x
vector<vector<int> > g;
int vis[10010];
int n;
int ans=0;
// 深度优先搜索函数
inline void dfs(int x)
{
vis[x]=1;
for(int i=0;i<n;i++)
{
if(g[x][i]==1)
{
if(!vis[i])
{
dfs(i);
}
ans+=(vis[i]==1);
}
}
vis[x]=-1;
}
int main()
{
// 读入 n
read(n);
// 初始化邻接矩阵
vector<vector<int>>(n+10,vector<int>(n+10,0)).swap(g);
// 读入 a 数组
for(int i=0;i<n;i++)
{
read(a[i]);
}
// 构建邻接矩阵
for(int i=0;i<n;i++)
{
g[a[i]][a[a[i]]]=1;
}
// 开始深度优先搜索
for(int i=0;i<n;i++)
{
if(vis[i]!=-1)
{
dfs(i);
}
}
// 输出结果
wtl(ans+1);
return 0;
}
这里空空如也
有帮助,赞一个