CCF網絡通信dfs

試題編號: 201709-4
試題名稱: 通信網絡
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  某國的軍隊由N個部門組成,爲了提高安全性,部門之間建立了M條通路,每條通路只能單向傳遞信息,即一條從部門a到部門b的通路只能由ab傳遞信息。信息可以通過中轉的方式進行傳遞,即如果a能將信息傳遞到bb又能將信息傳遞到c,則a能將信息傳遞到c。一條信息可能通過多次中轉最終到達目的地。
  由於保密工作做得很好,並不是所有部門之間都互相知道彼此的存在。只有當兩個部門之間可以直接或間接傳遞信息時,他們才彼此知道對方的存在。部門之間不會把自己知道哪些部門告訴其他部門。
RequireFile.do?fid=yHg9gf9quploading.4e448015.gif轉存失敗重新上傳取消
  上圖中給了一個4個部門的例子,圖中的單向邊表示通路。部門1可以將消息發送給所有部門,部門4可以接收所有部門的消息,所以部門1和部門4知道所有其他部門的存在。部門2和部門3之間沒有任何方式可以發送消息,所以部門2和部門3互相不知道彼此的存在。
  現在請問,有多少個部門知道所有N個部門的存在。或者說,有多少個部門所知道的部門數量(包括自己)正好是N

輸入格式

  輸入的第一行包含兩個整數NM,分別表示部門的數量和單向通路的數量。所有部門從1到N標號。
  接下來M行,每行兩個整數ab,表示部門a到部門b有一條單向通路。

輸出格式

  輸出一行,包含一個整數,表示答案。

樣例輸入

4 4
1 2
1 3
2 4
3 4

樣例輸出

2

樣例說明

  部門1和部門4知道所有其他部門的存在。

評測用例規模與約定

  對於30%的評測用例,1 ≤ N ≤ 10,1 ≤ M ≤ 20;
  對於60%的評測用例,1 ≤ N ≤ 100,1 ≤ M ≤ 1000;
  對於100%的評測用例,1 ≤ N ≤ 1000,1 ≤ M ≤ 10000。

代碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX_N=1000+5;
const int MAX_M=10000+5;
struct edge{
    int v,next;
}E[MAX_M];
int p[MAX_N],eid;
int result[MAX_N][MAX_N];
void init(){
    memset(p,-1,sizeof(p));
    eid=0;
}
void insert(int u,int v){
    E[eid].v=v;
    E[eid].next=p[u];
    p[u]=eid++;
}
int vst[MAX_N];
void dfs(int star,int u){
	result[star][u]=result[u][star]=1;
	vst[u]=1;
    for(int i=p[u];i+1;i=E[i].next){
        if(!vst[E[i].v]){
            dfs(star,E[i].v);
        }
    }
}
int main(){
	int n,m;
	cin>>n>>m;
	init();
	while(m--){
		int ip1,ip2;
		cin>>ip1>>ip2;
		insert(ip1,ip2);
	}
    for(int i=1;i<=n;i++){
    	memset(vst,0,sizeof(vst));
    	dfs(i,i);
	}	
	int ans=0;
	for(int i=1;i<=n;i++){
		int flag=0;
		for(int j=1;j<=n;j++){
			if(result[i][j]==0){
				flag=1;
				break;
			}
		}
		if(flag==0){
			ans++;
		}
	}
	cout<<ans<<endl;
	return 0;
}

 

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