zoukankan      html  css  js  c++  java
  • 通知小弟

    链接: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
    ",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
    ");
    88         else
    89         printf("%d
    ",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
    ",ans);
    72         }
    73     }
    74     return 0;
    75 }
    View Code
  • 相关阅读:
    【BigData】Java基础_ArrayList的使用
    【BigData】Java基础_构造方法的使用
    【BigData】Java基础_类和对象的基本使用
    【BigData】Java基础_冒泡排序
    【BigData】Java基础_数组
    【BigData】Java基础_循环
    【BigData】Java基础_终端输入2个数字并求和
    Navicat自动断开连接处理方式
    名字修饰约定extern "C"与extern "C++"浅析
    qt study 元对象,属性和反射编程
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13271233.html
Copyright © 2011-2022 走看看