• 校园网络(模拟)


     校园网络

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:5
     
    描述

    南阳理工学院共有M个系,分别编号1~M,其中各个系之间达成有一定的协议,如果某系有新软件可用时,该系将允许一些其它的系复制并使用该软件。但该允许关系是单向的,即:A系允许B系使用A的软件时,B未必一定允许A使用B的软件。

    现在,请你写一个程序,根据各个系之间达成的协议情况,计算出最少需要添加多少个两系之间的这种允许关系,才能使任何一个系有软件使用的时候,其它所有系也都有软件可用。

     
    输入
    第一行输入一个整数T,表示测试数据的组数(T<10)
    每组测试数据的第一行是一个整数M,表示共有M个系(2<=M<=100)。
    随后的M行,每行都有一些整数,其中的第i行表示系i允许这几个系复制并使用系i的软件。每行结尾都是一个0,表示本行输入结束。如果某个系不允许其它任何系使用该系软件,则本行只有一个0.
    输出
    对于每组测试数据,输出最少需要添加的这种允许关系的个数。
    样例输入
    1
    5
    2 4 3 0
    4 5 0
    0
    0
    1 0
    样例输出
    2
    
    题解: 刚开始想的是用map存关系,用dfs搜索N个点内形成数的个数,用out数组记录当前点是否与其他节点形成关系,画个有向树的方法,比较麻烦;
    代码:
     1 #include<stdio.h> 
     2 #include<string.h>
     3 const int MAXN=110;
     4 int map[MAXN][MAXN],out[MAXN];
     5 int vis[MAXN];
     6 int T,M;
     7 void dfs(int x){
     8     if(vis[x])return;
     9     vis[x]=1;
    10     for(int i=1;i<=M;i++){
    11         if(map[x][i]){
    12             dfs(i);
    13         }
    14     }
    15 }
    16 int main(){
    17     scanf("%d",&T);
    18     while(T--){
    19         scanf("%d",&M);
    20         memset(map,0,sizeof(map));
    21         memset(out,0,sizeof(out));
    22         memset(vis,0,sizeof(vis));
    23         for(int i=1;i<=M;i++){
    24             int a;
    25             while(scanf("%d",&a),a){
    26                 map[i][a]=1;
    27                 out[i]=1;
    28             }
    29         }
    30         for(int i=1;i<=M;i++){
    31             dfs(i);
    32         }
    33         int ans=0;
    34         for(int i=1;i<=M;i++){
    35         //    printf("%d %d
    ",vis[i],out[i]);
    36             if(!vis[i])ans++;
    37             if(!out[i])ans++;
    38         }
    39         printf("%d
    ",ans);
    40     }
    41     return 0;
    42 }

    然后看了别人写的,自己想的复杂了,只需要考虑每个点是否入度和出度即可,我的想法只是把入度,以树的形式表示出来了,也就是vis数组;

    另一种解法:

     1 #include<stdio.h>
     2 #include<string.h>
     3 const int MAXN=110;
     4 int in[MAXN],out[MAXN];
     5 int main(){
     6     int T,M;
     7     scanf("%d",&T);
     8     while(T--){
     9         memset(in,0,sizeof(in));
    10         memset(out,0,sizeof(out));
    11         scanf("%d",&M);
    12     for(int i=1;i<=M;i++){
    13             int a;
    14             while(scanf("%d",&a),a){
    15                 in[a]=1;
    16                 out[i]=1;
    17             }
    18         }
    19         int ans=0;
    20     for(int i=1;i<=M;i++){
    21         if(!in[i])ans++;
    22         if(!out[i])ans++;
    23     }
    24     printf("%d
    ",ans);
    25     }
    26     return 0;
    27 }
    
    
  • 相关阅读:
    一条语句简单解决“每个Y的最新X”的SQL经典问题
    SqlServer数据库字典--表.视图.函数.存储过程.触发器.主键.外键.约束.规则.sql
    SqlServer数据库字典--索引.sql
    SqlServer2005或2008数据库字典--表结构.sql
    SqlServer2000数据库字典--表结构.sql
    sqlserver附加 mdf、ldf的方法(手记)
    收缩数据库 DBCC SHRINKFILE
    日志、字段备注查询、自增ID联系设置、常用存储过程
    常用sql 全记录(添加中)
    python类的继承和多态,获取对象信息
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4835438.html
Copyright © 2020-2023  润新知