#include <iostream>
#include<vector>
using namespace std;
#include<vector>
using namespace std;
vector<int>r[2000];
int connect[2000][2000];
int N;
int check(int start,int neighbor,int visit[])
{
int connect[2000][2000];
int N;
int check(int start,int neighbor,int visit[])
{
int i;
visit[neighbor]=1;
connect[start][neighbor]=connect[neighbor][start]=1;
for(i=0;i<r[neighbor].size();i++)
{
if(visit[r[neighbor][i]]==0)
check(start,r[neighbor][i],visit);
}
return 0;
}
visit[neighbor]=1;
connect[start][neighbor]=connect[neighbor][start]=1;
for(i=0;i<r[neighbor].size();i++)
{
if(visit[r[neighbor][i]]==0)
check(start,r[neighbor][i],visit);
}
return 0;
}
int main()
{
int i,j,K,m,n;
int total=0;
int visit[3000];
memset(connect,0,sizeof(connect));
cin>>N>>K;
for(i=0;i<K;i++)
{
cin>>m>>n;
r[m].push_back(n);
}
for(i=1;i<=N;i++)
{
memset(visit,0,sizeof(visit));
check(i,i,visit);
}
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
if(connect[i][j]==0)
break;
}
if(j==N+1)
total++;
}
cout<<total;
return 0;
}
{
int i,j,K,m,n;
int total=0;
int visit[3000];
memset(connect,0,sizeof(connect));
cin>>N>>K;
for(i=0;i<K;i++)
{
cin>>m>>n;
r[m].push_back(n);
}
for(i=1;i<=N;i++)
{
memset(visit,0,sizeof(visit));
check(i,i,visit);
}
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
if(connect[i][j]==0)
break;
}
if(j==N+1)
total++;
}
cout<<total;
return 0;
}
本文介绍了一种基于C++实现的图遍历算法,通过邻接表存储节点间的关系,并利用递归方式完成从起点到所有可达节点的连接标记。程序能够找出图中的完全连通子集。
2064

被折叠的 条评论
为什么被折叠?



