通知小弟

链接:https://www.nowcoder.net/acm/contest/76/E
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

        在战争时期,A国派出了许多间谍到其他国家去收集情报。因为间谍需要隐秘自己的身份,所以他们之间只是单向联系。所以,某个间谍只能单向联系到一部分的间谍。同时,间谍也不知道跟他联系的是谁。
HA是间谍们的老大,但他也只能联系到部分的间谍。HA现在有一项命令有告诉所有的间谍。HA想要知道他至少要告诉多少个他能联系上的间谍才能通知到所有的间谍。

输入描述:

有多个测试数据。
对于每个测试数据:
第一行为一个整数n,m(0<n,m<=500)代表间谍的数量和HA能通知到的间谍的数量(间谍的编号为1-n);
第二行为m个用空格隔开的整数xi,代表HA能通知到的间谍的编号;
第三行到第n+2行,每一行第一个整数ai(0<=ai<n)表示第i-2个间谍能单向联系到的间谍数。之后有ai个用空格隔开的整数,表示间谍i-2能单向联系到的间谍的编号。

输出描述:

输出一行,此行中有一个整数,代表HA至少需要联系的间谍数。如果HA不能通知到所有间谍,输出-1。
示例1

输入

3 2
1 2
1 2
1 1
0

输出

-1
示例2

输入

3 1
1
2 2 3
0
0

输出

1
 1 #include <bits/stdc++.h>
 2 #define _xx ios_base::sync_with_stdio(0);cin.tie(0);
 3 using namespace std;
 4 typedef long long LL;
 5 vector<int>x;
 6 vector<int>a[505];
 7 bool vis[505],cst[505];
 8 int ans=0;
 9 void dfs(int k,int s)
10 {
11     vis[k]=1;
12     for(int i=0;i<a[k].size();i++){
13         int v=a[k][i];
14         if(!vis[v]) dfs(v,s);
15         else if(v!=s &&cst[v]){
16             cst[v]=false;
17             ans--;
18         }
19     }
20 }
21 int main()
22 {
23     int n,m;
24     while(~scanf("%d%d",&n,&m)){
25         memset(vis,0,sizeof(vis));
26         for(int i=1;i<=n;i++) a[i].clear();
27         x.clear();
28         ans=0;
29         for(int i=1;i<=m;i++){
30             int xx;scanf("%d",&xx);
31             x.push_back(xx);
32         }
33         for(int i=1;i<=n;i++){
34             int nn;scanf("%d",&nn);
35             for(int j=1;j<=nn;j++){
36                 int aa;scanf("%d",&aa);
37                 a[i].push_back(aa);
38             }
39         }
40         for(int i=0;i<m;i++){
41             if(!vis[x[i]]){
42                 ans++;
43                 cst[x[i]]=true;
44                 dfs(x[i],x[i]);
45             }
46         }
47         int flag=1;
48         for(int i=1;i<=n;i++){
49             if(!vis[i]){flag=0;break;}
50         }
51         printf("%d\n",flag?ans:-1);
52     }
53     return 0;
54 }
View Code
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mod =1e9+7;
 5 int n,m;
 6 int x[505];
 7 vector<int>g[505];
 8 bool vis[505];
 9 int in[505];
10 bool judge()
11 {
12     for(int i=1;i<=n;i++)
13     if(!vis[i])return 0;
14     return 1;
15 }
16 void dfs(int u)
17 {
18     vis[u]=1;
19     for(int i=0;i<g[u].size();i++)
20     {
21         if(!vis[g[u][i]])
22         {
23             dfs(g[u][i]);
24         }
25     }
26 }
27 int ling[540];
28 bool viss[505];
29 int main()
30 {
31     while(~scanf("%d%d",&n,&m))
32     {
33         for(int i=1;i<=m;i++)
34         scanf("%d",&x[i]);
35         for(int i=1;i<=n;i++)
36         g[i].clear();
37         memset(vis,0,sizeof vis);
38         memset(in,0,sizeof in);
39         memset(viss,0,sizeof viss);
40         for(int i=1;i<=n;i++)
41         {
42             int p;
43             scanf("%d",&p);
44             while(p--)
45             {
46                 int q;
47                 scanf("%d",&q);
48                 g[i].push_back(q);
49                 in[q]++;
50             }
51         }
52         int cnt=0;
53         for(int i=1;i<=n;i++)
54         {
55             if(in[i]==0)
56             {
57                 ling[cnt++]=i;
58             }
59         }
60         int ans=0;
61         for(int i=0;i<cnt;i++)
62         {
63             bool ff=0;
64             for(int j=1;j<=m;j++)
65             {
66                 if(x[j]==ling[i]&&!vis[x[j]])
67                 {
68                     dfs(x[j]);
69                     viss[j]=1;
70                     break;
71                 }
72             }
73         }
74         ans=cnt;
75         if(!judge())
76         {
77             for(int i=1;i<=m;i++)
78             {
79                 if(!vis[x[i]]&&!viss[x[i]])
80                 {
81                     dfs(x[i]);
82                     ans++;
83                  }
84             }
85         }
86         if(!judge())
87         printf("-1\n");
88         else
89         printf("%d\n",ans);
90     }
91        
92        
93 }
View Code
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int vis[550];
 4 vector<int>p[550];
 5 int a[550];
 6 int findx(int x)
 7 {
 8     return a[x]==x?x:(a[x]=findx(a[x]));
 9 }
10 int n;
11 bool bfs(int root)
12 {
13     memset(vis,0,sizeof(vis));
14     vis[root]=1;
15     queue<int>q;
16     q.push(root);
17     while(!q.empty())
18     {
19         int s=q.front();
20         q.pop();
21         for(int i=0;i<p[s].size();i++)
22         {
23             int e=p[s][i];
24             if(!vis[e])
25             {
26                 vis[e]=1;
27                 q.push(e);
28             }
29         }
30     }
31     for(int i=0;i<=n;i++)
32     {
33         if(!vis[i])return false;
34     }
35     return true;
36 }
37 int main()
38 {
39     int m;
40     while(scanf("%d%d",&n,&m)!=-1)
41     {
42         for(int i=1;i<=n;i++)
43             a[i]=i,p[i].clear();
44         while(m--)
45         {
46             int x;
47             scanf("%d",&x);
48             p[0].push_back(x);
49         }
50         for(int i=1;i<=n;i++)
51         {
52             scanf("%d",&m);
53             while(m--)
54             {
55                 int x;
56                 scanf("%d",&x);
57                 p[i].push_back(x);
58                 int xx=findx(i);
59                 int yy=findx(x);
60                 if(xx!=yy)
61                     a[yy]=xx;
62             }
63         }
64         if(!bfs(0))puts("-1");
65         else
66         {
67             int ans=0;
68             for(int i=1;i<=n;i++)
69                 if(i==findx(i))
70                 ans++;
71             printf("%d\n",ans);
72         }
73     }
74     return 0;
75 }
View Code

 

posted on 2018-02-11 21:06  蔡军帅  阅读(167)  评论(0编辑  收藏  举报