LOJ-10094(强连通分量)

news/2024/7/8 2:48:43

题目链接:传送门

思路:

先缩点,然后统计入度为0的点即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e6+10;
int num[maxn],low[maxn],tim,col,co[maxn];
int head[maxn],next[maxn],ver[maxn],tot;
int st[maxn],top,in[maxn];
int MIN(int x,int y)
{
    return x<y?x:y;
}
void Init()
{
    memset(num,0,sizeof(num));
    memset(low,0,sizeof(low));
    memset(head,0,sizeof(head));
    memset(next,0,sizeof(next));
    memset(ver,0,sizeof(ver));
    memset(co,0,sizeof(co));
    tot=0;tim=0;col=0;top=0;
}
void addedge(int x,int y)
{
    ver[++tot]=y;next[tot]=head[x];head[x]=tot;
}
void Tarjan(int u)
{
    int v,i;
    low[u]=num[u]=++tim;
    st[++top]=u;
    for(i=head[u];i;i=next[i]){
        v=ver[i];
        if(!num[v]){
            Tarjan(v);
            low[u]=MIN(low[u],low[v]);
        }
        else if(!co[v]) low[u]=MIN(low[u],num[v]);
    }
    if(low[u]==num[u]){
        col++;
        co[u]=col;
        while(st[top]!=u){
            co[st[top]]=col;
            top--;
        }
        top--;
    }
}
int main(void)
{
    int n,i,j,x;
    scanf("%d",&n);
    Init();
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            scanf("%d",&x);
            if(x) addedge(i,j);
        }
    }
    for(i=1;i<=n;i++)
    if(!num[i]) Tarjan(i);
     
    for(i=1;i<=n;i++){
        for(j=head[i];j;j=next[j]){
            if(co[i]!=co[ver[j]]) in[co[ver[j]]]++;
        }
    }
    int cnt=0;
    for(i=1;i<=col;i++)
    if(in[i]==0) cnt++;
    printf("%d\n",cnt);
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/2018zxy/p/10368197.html


http://www.niftyadmin.cn/n/4556394.html

相关文章

【react】使用 create-react-app 构建基于TypeScript的React前端架构----上

写在前面 一直在探寻&#xff0c;那优雅的美&#xff1b;一直在探寻&#xff0c;那精湛的技巧&#xff1b;一直在探寻&#xff0c;那简单又直白&#xff0c;优雅而美丽的代码。 ------ 但是在JavaScript的动态类型、有时尴尬的自动类型转换&#xff0c;以及 “0 false” 是tru…

一个VB编程 急 帮忙

" exit sub end if Ssqr(l*(l-a)*(l-b)*(l-c)) print S 试一下吧 ||| 将代码直接粘贴然后运行即可 l c b ") if ubound(strcomp) 2 then n1val(strcomp(0)) n2val(strcomp(1)) n3val(strcomp(3)) 判断都跟楼上差不多吧 dim strComp() as string 3分离用Split涵数 2 模…

高手进 C语言问题

得到的就是树的高度 然后直接舍去小数点后的数 底数为2 log(n) 那么高度是 0 --> 结点共有 1高度是 1 --> 结点共有 3高度是 2 --> 结点共有 7高度是 3 --> 结点共有 15高度是 4 --> 结点共有 31高度是 5 --> 结点共有 63高度是 6 --> 结点共有 127高度是…

知识点累积

1&#xff0c;反向解析 示例代码&#xff1a; def display_record(self, objNone, is_headerNone, *args, **kwargs):if is_header:return 跟进record_url reverse(stark:web_consultrecord_list, kwargs{customer_id: obj.pk})return mark_safe(<a target"_blank&quo…

ref C#中的ShowDialog和Show的区别 为什么再ShowDialog中修改变量时原窗口中的变量不会被改变 out如何在这里应用

我们可以将show方法转化为showdialog方法 很是不顺手 窗口的顺序也有可能被再次打乱 一但出现问题 而且 那样我们还有花费时间寻找我们要用的窗口 我们往往不喜欢窗口之间的随意切换 比如你在浏览器点击另存为弹出的窗口就是模式窗口 但是他由于未进行绑定 它所显示的各个窗口、…

centos7中/tmp文件保存天数

不要在/tmp目录下保存文件&#xff0c;该目录会定期清理文件 /tmp默认保存10天 /var/tmp默认保存30天 配置文件&#xff1a;/usr/lib/tmpfiles.d/tmp.conf 默认配置文件&#xff1a;# This file is part of systemd.## systemd is free software; you can redistribute it and/…

由Windows开发平台向Linux平台转移的一些想法

从毕业到现在已经快20年了&#xff0c;一直在从事Windows平台上的开发工作。刚毕业那会大约是97&#xff0c;98年左右&#xff0c;工作的平台除了Windows平台还有Dos平台&#xff0c;因为在学校学习时&#xff0c;也是从Dos开始的。因此对于从事Dos平台上的DBase程序开发也不需…

Java Jsp+Json+阿贾克斯

0目录 1.补充阿贾克斯 2.实战&#xff08;加入Json&#xff09; 1.补充阿贾克斯 创建工程&#xff0c;加入jason依赖和数据库 新建数据库&#xff0c;表和实体类 先新建一个查询方法 FruitServlet 修改Web.xml 加入Js包&#xff08;版本1.9.1&#xff09; …