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\n",sum);
56     return 0;  
57 }