POJ 1236 Network of Schools (Tarjian缩点后建图,求出入度)

16 篇文章 0 订阅
7 篇文章 0 订阅

POJ 1236 Network of Schools )

题目

题目很长,其实题意很简单,给一个有向图,问

  1. 最少从几个点出发能够走遍全图
  2. 最少加上几条边能够该图变为强连通图

分析

直接 T a r j i a n Tarjian Tarjian 缩点后分析 D A G DAG DAG 图的性质,从所有起点开始走就可以走遍全图,也就似乎度为 0 的点。而第二个问题,设建成的 D A G DAG DAG 图的入度,出度为 0 的节点数量为 a, b。保证 m a x ( a , b ) max(a,b) max(a,b) 条边加进去即可。

S C C SCC SCC 图的出入度表。先假设每个点都不相连,即初度入度都为 0 ,遇到 u 指向 v 的边,v 的入度,u 的出度都要为一。

后面要特判强连通图。/

代码

#include<cstdio>
#include <iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<stack>
using namespace std;
#define d(x) cout<<(x)<<endl
const int N = 1e3 + 10;

int n;
int pre[N], sccno[N], scc_cnt, low[N], dfs_clock;
vector<int> e[N];
stack<int> s;

void dfs(int u){
    pre[u] = low[u] = ++dfs_clock;
    s.push(u);
    for(int i = 0; i < e[u].size(); i++){
        int v = e[u][i];
        if(!pre[v]){
            dfs(v);
            low[u] = min(low[u], low[v]);
        }else if(!sccno[v]){
            low[u] = min(low[u], pre[v]);
        }
    }
    if(low[u] == pre[u]){
        scc_cnt++;
        while(1){
            int x = s.top();
            s.pop();
            sccno[x] = scc_cnt;
            if(x == u)
                break;
        }
    }
}

void find_scc(){
    memset(pre, 0, sizeof(pre));
    memset(sccno, 0, sizeof(sccno));
    dfs_clock = scc_cnt = 0;
    for(int i = 1; i <= n; i++){
        if (!pre[i]){
            dfs(i);
        }
    }
}

void cal(){
    int in[N], out[N];
    for(int i = 1; i <= scc_cnt; i++)
        in[i] = out[i] = 1;
    for(int u = 1; u <= n; u++){
        for(int i = 0; i < e[u].size(); i++){
            int v = e[u][i];
            if(sccno[u] != sccno[v])
                in[sccno[v]] = out[sccno[u]] = 0;
        }
    }
    int a = 0, b = 0;
    for(int i = 1; i <= scc_cnt; i++){
        if(in[i]) a++;
        if(out[i]) b++;
    }
    printf("%d\n%d\n", a, max(a, b));
}

int main(){
    scanf("%d", &n);
    for(int i = 1, x; i <= n; i++){
        while(scanf("%d", &x) && x){
            e[i].push_back(x);
        }
    }
    find_scc();
    // d("fd");
    if(scc_cnt == 1){
        printf("1\n0\n");
    }else{
        cal();
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip
毕设新项目基于python3.7+django+sqlite开发的学生就业管理系统源码+使用说明(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 学生就业管理系统(前端) ## 项目开发环境 - IDE: vscode - node版本: v12.14.1 - npm版本: 6.13.4 - vue版本: @vue/cli 4.1.2 - 操作系统: UOS 20 ## 1.进入项目目录安装依赖 ``` npm install ``` ## 2.命令行执行进入UI界面进行项目管理 ``` vue ui ``` ## 3.编译发布包(请注意编译后存储路径) #### PS:需要将编译后的包复制到后端项目的根目录下并命名为'static' 学生就业管理系统(后端) ## 1.项目开发环境 - IDE: vscode - Django版本: 3.0.3 - Python版本: python3.7.3 - 数据库 : sqlite3(测试专用) - 操作系统 : UOS 20 ## 2.csdn下载本项目并生成/安装依赖 ``` pip freeze > requirements.txt pip install -r requirements.txt ``` ## 3.项目MySQL数据库链接错误 [点击查看解决方法](https://www.cnblogs.com/izbw/p/11279237.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值