题目来自CCF CSP认证
思路分析
主要思路:进行暴力深度遍历。
代码解析
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
int mp[1001][1001]; //邻接矩阵
int vis[1200]; //标记访问
vector<int> vec[1001]; //每一直接相连的点的集合
//exp为该路径经过的点,start为起始点
void dfs(int exp, int start) {
vis[exp] = 1;
mp[start][exp] = 1;
mp[exp][start] = 1;
//遍历与start相连的所有的点
for (int i = 0; i < vec[exp].size(); ++i) {
if (!vis[vec[exp][i]]) {
dfs(vec[exp][i], start);
}
}
}
int main()
{
ios::sync_with_stdio(false);
int N, M;
cin.tie(0);
cin >> N >> M;
//矩阵初始化
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= N; ++j)
mp[i][j] = 0;
}
int start, end;
//数据读入
for (int i = 1; i <= M; ++i) {
cin >> start >> end;
vec[start].push_back(end);
}
//每一个点进行深度遍历
for (int i = 1; i <= N; ++i) {
memset(vis, 0, sizeof(vis));
dfs(i, i);
}
int ans = 0;
for (int i = 1; i <= N; ++i) {
int j;
//每一个点都与其他点相连时
for (j = 1; j <= N; ++j) {
if (!mp[i][j])
break;
}
//都相连时
if (j == N + 1)
ans++;
}
printf("%d",ans);
return 0;
}
测试结果