ccf-170904-通信网络
题目分析:
有向图 如果a可以直接或者间接连接b则a与b相互知晓 一共有多少个点知道n个点
刚开始算错复杂度,优化后反而超时 。。。事实无脑爆搜这道题也是可取的因为只有1000个点
每次选定一个点start开始dfs,吧start所能到达的点全部找出来,记录在mp数组内,所连接点的个数记录在num[]数组中
一个小优化 。事实不优化也能过。当dfs过程中 发现start点到达的点为n时就结束 没必要继续dfs了
1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 #include <cstdio> 5 #include <cstring> 6 using namespace std; 7 const int N=1e3+3; 8 vector < vector <int> > g(N); 9 bool mp[N][N]; 10 bool visit[N]; 11 int num[N]; 12 int start; 13 int n,m; 14 void dfs (int root) { 15 visit[root]=1; 16 for (int i=0;i<g[root].size();i++) { 17 int next=g[root][i]; 18 if (!visit[next]) { 19 if (!mp[start][next]) { 20 mp[start][next]=mp[next][start]=1; 21 num[next]++; num[start]++; 22 if (num[start]>=n) break; 23 } 24 dfs (next); 25 if (num[start]>=n) break; 26 } 27 } 28 return ; 29 } 30 int main () 31 { 32 scanf ("%d %d",&n,&m); 33 for (int i=1;i<=n;i++) { 34 mp[i][i]=1; num[i]++; 35 } 36 for (int i=1;i<=m;i++) { 37 int x,y; scanf ("%d %d",&x,&y); 38 g[x].push_back(y); 39 if (!mp[x][y]) { 40 mp[x][y]=mp[y][x]=1; 41 num[x]++; num[y]++; 42 } 43 } 44 for (int i=1;i<=n;i++) { 45 memset (visit,0,sizeof(visit)); 46 if (num[i]<n) { 47 start=i; 48 dfs (i); 49 } 50 } 51 int sum=0; 52 for (int i=1;i<=n;i++) 53 if (num[i]>=n) 54 sum++; 55 printf ("%d ",sum); 56 return 0; 57 }