由於本人能力有限,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;
}