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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值