[强联通分量_DFS] 0725

本文探讨了在单向网络中软件如何有效传播的问题。主要解决两个方面:一是确定初始发放软件的最少学校数量;二是计算使任意学校都能传播软件所需的最少新增线路数目。采用缩点、深度优先搜索等算法解决此问题。

N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。
问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。
问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。

input format:
输入有多组样例,大约1000组。
每组样例第一行包含两个整数N,M(2<=N<=100),N代表学校的个数,M代表边的个数(M<N*N)
接下来M行,每行包含连个整数u,v,代表u可以向v单向发送数据。

output format
每组样例对应两行,分别是问题一和问题二的解。

sample input
7 8
1 2
2 3
3 1
1 4
4 5
5 6
6 4
7 6

sample output
2
2

----------------------------------------------------------------------------------

所需发放软件的数量为缩点后入度为0的点的个数,所需添加的边为入度为0和出度为0点的个数的较大者。

----------------------------------------------------------------------------------

# include <cstdio>
# include <cstring>

# define N 100 + 5

int n, m;
int t, cols;
int f[N], c[N], in[N], out[N];
char vis[N], g[N][N];

void read_graph(void)
{
    int u, v;
    for (int i = 1; i <= n; ++i)
    {
        in[i] = 0;
        memset(g[i]+1, 0, sizeof(int)*n);
    }
    for (int i = 1; i <= m; ++i)
    {
        scanf("%d%d", &u, &v);
        g[u][v] = 1;
    }
}

void dfs(int u)
{
    vis[u] = 1;
    for (int v = 1; v <= n; ++v) if (!vis[v] && g[u][v])
        dfs(v);
    f[++t] = u;
}

void rdfs(int u)
{
    vis[u] = 1;
    c[u] = cols;
    for (int v = 1; v <= n; ++v) if (!vis[v] && g[v][u])
        rdfs(v);
}

void solve(void)
{
    t = 0;
    memset(vis+1, 0, sizeof(char)*n);
    for (int i = 1; i <= n; ++i) if (!vis[i]) dfs(i);
    cols = 0;
    memset(vis+1, 0, sizeof(char)*n);
    for (int i = n; i >= 1; --i) if (!vis[f[i]]) ++cols, rdfs(f[i]);
    if (cols == 1) {printf("1\n0\n"); return ;}
    memset(in+1,  0, sizeof(int)*cols);
    memset(out+1, 0, sizeof(int)*cols);
    for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
    {
        if(g[i][j] && c[i] != c[j])
        {
            ++in[c[j]];
            ++out[c[i]];
        }
    }
    int zin = 0, zout = 0;
    for (int i = 1; i <= cols; ++i)
    {
        if (in[i]  == 0) ++zin;
        if (out[i] == 0) ++zout;
    }
    printf("%d\n%d\n", zin, zin>zout ? zin:zout);
}


int main()
{    
    while (~scanf("%d%d", &n, &m))
    {
        read_graph();
        solve();
    }
    
    return 0;
}

转载于:https://www.cnblogs.com/JMDWQ/archive/2012/08/07/2626079.html

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值