CCF2017——3,4题题解

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

猜你喜欢

转载自blog.csdn.net/arthu6/article/details/84996535
今日推荐