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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章