空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
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。
输入
3 2 1 2 1 2 1 1 0
输出
-1
输入
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 }
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 }
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 }