其实就是手打了个Tarjan的模板

输出的时候注意是入度为0的点的个数和max(入度0的个数,出度0的个数),在n=1时特判为0即可

——以后图论要渐渐模板化,方便使用

 #include <cstdio>
#include <iostream>
using namespace std;
struct E
{
int from,to,next;
} e[];
int Enum=,sttop=;
int first[];
int dfn[],low[];
bool que[];
int tar[];
int sum,n,_ans,ans;
int df;
int num[];
int st[];
void add(int from,int to)
{
E New;
New.from=from;
New.to=to;
New.next=first[from];
e[++Enum]=New;
first[from]=Enum;
}
void tarjan_dfs(int u)
{
st[++sttop]=u;
int v;
que[u]=;
dfn[u]=low[u]=++df;
for(int i=first[u];i;i=e[i].next)
{
v=e[i].to;
if(dfn[v]==)
{
tarjan_dfs(v);
low[u]=min(low[u],low[v]);
}
else
if(que[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
sum++;
do
{
v=st[sttop--];
que[v]=;
tar[v]=sum;
}while(u!=v);
}
}
int tarjan()
{
sum=;df=;sttop=;
for(int i=;i<=n;i++)
if(!dfn[i])
tarjan_dfs(i);
for(int i=;i<=n;i++)
first[i]=;//清空原有边
for(int i=;i<=Enum;i++)
if(tar[e[i].from]!=tar[e[i].to])
{
e[i].from=tar[e[i].from];
e[i].to=tar[e[i].to];
e[i].next=first[e[i].from];
first[e[i].from]=i;
num[e[i].to]++;
}
return sum;
}
void dfs(int k)
{
if(first[k])
for(int i=first[k];i;i=e[i].next)
dfs(e[i].to);
else
if(!que[k])
{
_ans++;
que[k]=;
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int k;
scanf("%d",&k);
while(k>)
{
add(i,k);
scanf("%d",&k);
}
}
n=tarjan();
for(int i=;i<=n;i++)
que[i]=;
for(int i=;i<=n;i++)
if(!num[i])
{
ans++;
dfs(i);
}
printf("%d\n%d\n",ans,n==?:max(ans,_ans));
return ;
}

poj1236Network of Schools Tarjan裸题的更多相关文章

  1. POJ1236-Network of Schools(Tarjan + 缩点)

    主题链接 题意:给定一张有向图,问最少选择几个点能遍历全图.以及最少加入几条边使得有向图成为一个强连通图. 思路:对于有向图而言,首先求出有几个强连通分量,之后将每一个强连通分量缩点,形成DAG.本题 ...

  2. Tarjan 做题总结

    这两天Tarjan复习完后把题做了做.洛谷题单<图的连通性>已经做得差不多了.大部分是Tarjan的题,所以写一篇小总结. T1 [模板] 缩点 不多bb.我已经写过关于Tarjan模板的 ...

  3. tarjan讲解(用codevs1332(tarjan的裸题)讲解)

    主要借助这道比较裸的题来讲一下tarjan这种算法 tarjan是一种求解有向图强连通分量的线性时间的算法.(用dfs来实现) 如果两个顶点可以相互通达,则称两个顶点强连通.如果有向图G的每两个顶点都 ...

  4. Tarjan水题系列(4):HAOI2010 软件安装

    题目: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi​的磁盘空间,它的价值为Vi​.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi​的和最大). ...

  5. 【填坑】bzoj3224 splay裸题

    人生第一道splay不出所料是一道裸题,一道水题,一道2k代码都不到的题 #include <cstdio> ,n,p,q; ],c[][],size[],sp[]; void rot(i ...

  6. LCT裸题泛做

    ①洞穴勘测 bzoj2049 题意:由若干个操作,每次加入/删除两点间的一条边,询问某两点是否连通.保证任意时刻图都是一个森林.(两点之间至多只有一条路径) 这就是个link+cut+find roo ...

  7. 贴一下WC总结里提到的那道裸题吧。。。

    [bzoj4034][HAOI2015]T2 试题描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 ...

  8. HDU 1102 最小生成树裸题,kruskal,prim

    1.HDU  1102  Constructing Roads    最小生成树 2.总结: 题意:修路,裸题 (1)kruskal //kruskal #include<iostream> ...

  9. hdu Flow Problem (最大流 裸题)

    最大流裸题,贴下模版 view code#include <iostream> #include <cstdio> #include <cstring> #incl ...

随机推荐

  1. JS 加载html 在IE7 IE8下 可调试

    实际背景 就是都是HTML 公共头部底部  然后中间部分加载不同的HTML文件 有点跟模板引擎一样 jQuery 有个load函数 加载html文件的路径 获取html内容 到中间部分 正常下是不能用 ...

  2. junit学习笔记

    junit编程规范 测试方法上必须使用@Test进行修饰 测试方法必须使用public void 进行修饰,不能带任何的参数 新建一个源代码目录 测试类的包应该和被测试类保持一致 测试单元中的每个方法 ...

  3. 深入理解javascript原型和闭包(7)——原型的灵活性

    在Java和C#中,你可以简单的理解class是一个模子,对象就是被这个模子压出来的一批一批月饼(中秋节刚过完).压个啥样,就得是个啥样,不能随便动,动一动就坏了. 而在javascript中,就没有 ...

  4. Shell case esac语句

    case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构. case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: ...

  5. Android高手速成--第四部分 开发工具及测试工具

    第四部分 开发工具及测试工具 主要介绍和Android开发工具和测试工具相关的开源项目. 一.开发效率工具 Json2Java根据JSon数据自动生成对应的Java实体类,还支持Parcel.Gson ...

  6. shell--3.运算符

    1.注意 原生bash不支持简单的数学运算,但是可以用其它命令来实现如 awk 和expr ,expr最常用 val=`expr 2 + 3` echo "结果 ${val}" # ...

  7. java基础知识(四)java内存机制

    Java内存管理:深入Java内存区域 上面的文章对于java的内存管理机制讲的非常细致,在这里我们只是为了便于后面内容的理解,对java内存机制做一个简单的梳理. 程序计数器:当前线程所执行的字节码 ...

  8. 关于用bootstrap显示查询的后台数据

    PrintWriter pw = response.getWriter(); pw.println(sb); pw.flush(); 由于用bootstrap查询数据,页面需要自身返回bootstra ...

  9. Gym - 101102C

    题目链接 #include <bits/stdc++.h> using namespace std; ; int data[maxn],last[maxn],ans; struct D { ...

  10. 可以改变this指向的方法

    this一般指向的是当前被调用者,但也可以通过其它方式来改变它的指向,下面将介绍三种方式: 1.call用作继承时: function Parent(age){ this.name=['mike',' ...