• csp 通信网络


    http://blog.csdn.net/zyy_1998/article/details/78334496

    试题编号: 201709-4
    试题名称: 通信网络
    时间限制: 1.0s
    内存限制: 256.0MB
    问题描述:
    问题描述
      某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只能单向传递信息,即一条从部门a到部门b的通路只能由ab传递信息。信息可以通过中转的方式进行传递,即如果a能将信息传递到bb又能将信息传递到c,则a能将信息传递到c。一条信息可能通过多次中转最终到达目的地。
      由于保密工作做得很好,并不是所有部门之间都互相知道彼此的存在。只有当两个部门之间可以直接或间接传递信息时,他们才彼此知道对方的存在。部门之间不会把自己知道哪些部门告诉其他部门。

      上图中给了一个4个部门的例子,图中的单向边表示通路。部门1可以将消息发送给所有部门,部门4可以接收所有部门的消息,所以部门1和部门4知道所有其他部门的存在。部门2和部门3之间没有任何方式可以发送消息,所以部门2和部门3互相不知道彼此的存在。
      现在请问,有多少个部门知道所有N个部门的存在。或者说,有多少个部门所知道的部门数量(包括自己)正好是N
    输入格式
      输入的第一行包含两个整数NM,分别表示部门的数量和单向通路的数量。所有部门从1到N标号。
      接下来M行,每行两个整数ab,表示部门a到部门b有一条单向通路。
    输出格式
      输出一行,包含一个整数,表示答案。
    样例输入
    4 4
    1 2
    1 3
    2 4
    3 4
    样例输出
    2
    样例说明
      部门1和部门4知道所有其他部门的存在。
    评测用例规模与约定
      对于30%的评测用例,1 ≤ N ≤ 10,1 ≤ M ≤ 20;
      对于60%的评测用例,1 ≤ N ≤ 100,1 ≤ M ≤ 1000;
      对于100%的评测用例,1 ≤ N ≤ 1000,1 ≤ M ≤ 10000。
    #include<iostream>
    #include<stdio.h>
    #include<vector>
    #include<string.h>
    using namespace std;
    int node,side;
    vector <int>graph[1005];
    int vis[1005];
    int flag[1005][1005]={0};//是否能从a到b
    void  dfs(int a,int b)//把能到达的点的flag置为1
    {
        vis[a]=1;
        flag[a][b]=flag[b][a]=1;//可到达自身
        for(int j=0;j<graph[a].size();j++)
        {
            if(!vis[graph[a][j]])//没有访问过且能访问到的
            {
    
                dfs(graph[a][j],b);
            }
        }
        return ;
    }
    int main()
    {
    
        int i,j;
        int counter=0;
        cin>>node>>side;
        int a,b;
        for(int i=0;i<=node;i++)
            graph[i].clear();
        for(i=1;i<=side;i++)
        {
           scanf("%d%d",&a,&b);
           graph[a].push_back(b);
        }
    
        for(i=1;i<=node;i++)
        {
          memset(vis,0,sizeof(vis));
          dfs(i,i);
        }
       for(i=1;i<=node;i++)
        {
            for(j=1;j<=node;j++)
            {
                if(!flag[i][j]||!flag[j][i])
                    break;
            }
            if(j==node+1)counter++;
        }
        printf("%d
    ",counter);
        return 0;
    }
    

      

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<vector>
     4 #include<string.h>
     5 using namespace std;
     6 int node,side;
     7 vector <int>graph[1005];
     8 int vis[1005];
     9 int flag[1005][1005]={0};//是否能从a到b
    10 void  dfs(int a,int b)//把能到达的点的flag置为1
    11 {
    12     vis[a]=1;
    13     flag[a][b]=flag[b][a]=1;//可到达自身
    14     for(int j=0;j<graph[a].size();j++)
    15     {
    16         if(!vis[graph[a][j]])//没有访问过且能访问到的
    17         {
    18             dfs(graph[a][j],b);
    19         }
    20     }
    21     return ;
    22 }
    23 int main()
    24 {
    25 
    26     int i,j;
    27     int counter=0;
    28     cin>>node>>side;
    29     int a,b;
    30     for(int i=0;i<node;i++)
    31         graph[i].clear();
    32     for(i=0;i<side;i++)
    33     {
    34        scanf("%d%d",&a,&b);
    35        graph[a].push_back(b);
    36     }
    37 
    38     for(i=0;i<node;i++)
    39     {
    40       memset(vis,0,sizeof(vis));
    41       dfs(i,i);
    42     }
    43     for(i=0;i<node;i++)
    44     {
    45         for(j=0;j<node;j++)
    46         {
    47             if(!flag[i][j]||!flag[j][i])
    48                 break;
    49         }
    50         if(j==node)counter++;
    51     }
    52     printf("%d
    ",counter);
    53     return 0;
    54 }
  • 相关阅读:
    正则表达式(四)--文本换行分割
    java加密类型和算法名称
    记事本记录日志
    DNS
    jstl--c:choose标签
    csv文本编辑引号问题
    JDBC----ReflectionUtils
    Jsp
    计算机网络 编程 总结:
    N颗骰子的问题
  • 原文地址:https://www.cnblogs.com/curo0119/p/8508548.html
Copyright © 2020-2023  润新知