由于本人能力有限,3,4题可能多有借鉴,就不由于列举出处了。
通信网络
思路:见代码注释(DFS对所有节点遍历每一个节点所连的所有节点,若该节点能遍历到所有节点,计数器加一)
代码及注释:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int flag[1005][1005];//标志组,i知道j部门,则flag[i][j]置1
int visited[1005];//可访问的所有部门
vector<int>V[1005];//每个部门知道的所有部门
void dfs(int a,int t)
{
visited[a]=1;//a知道a部门
flag[a][t]=flag[t][a]=1;//a和b部门互相知道
for(int i=0;i<V[a].size();i++)//遍历a知道的部门
{
if(!visited[V[a][i]])//a知道i部门
{
dfs(V[a][i],t);//a知道i知道的所有部门
}
}
}
int main()
{
int N,M,i,j,a,b,ans;
cin>>N>>M;
memset(flag,0,sizeof(flag));
for(i=0;i<=N;i++) V[i].clear();
for(i=1;i<=M;i++)
{
cin>>a>>b;
V[a].push_back(b);
}
for(i=1;i<=N;i++)//遍历每个部门
{
memset(visited,0,sizeof(visited));//清零每个部门知道的部门
dfs(i,i);//a知道a知道的所有部门
}
ans=0;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
if(!flag[i][j])//i部门不知道j部门
break;
}
if(j==N+1) ans++;//i部门知道所有部门
}
cout<<ans<<endl;//知道所有部门的部门数
return 0;
}