poj1236Network of Schools Tarjan裸题
其实就是手打了个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裸题的更多相关文章
- POJ1236-Network of Schools(Tarjan + 缩点)
主题链接 题意:给定一张有向图,问最少选择几个点能遍历全图.以及最少加入几条边使得有向图成为一个强连通图. 思路:对于有向图而言,首先求出有几个强连通分量,之后将每一个强连通分量缩点,形成DAG.本题 ...
- Tarjan 做题总结
这两天Tarjan复习完后把题做了做.洛谷题单<图的连通性>已经做得差不多了.大部分是Tarjan的题,所以写一篇小总结. T1 [模板] 缩点 不多bb.我已经写过关于Tarjan模板的 ...
- tarjan讲解(用codevs1332(tarjan的裸题)讲解)
主要借助这道比较裸的题来讲一下tarjan这种算法 tarjan是一种求解有向图强连通分量的线性时间的算法.(用dfs来实现) 如果两个顶点可以相互通达,则称两个顶点强连通.如果有向图G的每两个顶点都 ...
- Tarjan水题系列(4):HAOI2010 软件安装
题目: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). ...
- 【填坑】bzoj3224 splay裸题
人生第一道splay不出所料是一道裸题,一道水题,一道2k代码都不到的题 #include <cstdio> ,n,p,q; ],c[][],size[],sp[]; void rot(i ...
- LCT裸题泛做
①洞穴勘测 bzoj2049 题意:由若干个操作,每次加入/删除两点间的一条边,询问某两点是否连通.保证任意时刻图都是一个森林.(两点之间至多只有一条路径) 这就是个link+cut+find roo ...
- 贴一下WC总结里提到的那道裸题吧。。。
[bzoj4034][HAOI2015]T2 试题描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 ...
- HDU 1102 最小生成树裸题,kruskal,prim
1.HDU 1102 Constructing Roads 最小生成树 2.总结: 题意:修路,裸题 (1)kruskal //kruskal #include<iostream> ...
- hdu Flow Problem (最大流 裸题)
最大流裸题,贴下模版 view code#include <iostream> #include <cstdio> #include <cstring> #incl ...
随机推荐
- mui jquery 同时使用
(function ($, doc, $$) { $.init(); $.ready(function () { var cityPicker = new $.PopPicker({ layer: } ...
- TransactionScope 之分布式配置
.Net开发过程中,涉及多个数据库和不同数据库的分布式事务(Distributed Transaction)开发,有时会碰到“与基础事务管理器的通信失败”的错误.导致这个错误一般有下列三个原因:1) ...
- tyvj1144 股票
描述 2130年,股神巴菲特投胎了!他投胎到你身上!你作为股神转世,能力比原股神还要强,你可以预测到今后n天的股价.假设刚开始你的手上有1元钱,你想知道n天后你最多可以赚到多少钱.作为股神转世,你准备 ...
- [Scala] 快学Scala A1L1
基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...
- PAT mooc DataStructure 4-2 SetCollection
数据结构习题集-4-2 集合的运用 1.题目: We have a network of computers and a list of bi-directional connections. Eac ...
- PHP之static静态变量详解(二)
在看别人项目过程中,看到函数里面很多static修饰的变量,关于static修饰的变量,作用域,用法越看越困惑,所以查了下资料. static用法如下: 1.static 放在函数内部修饰变量 2.s ...
- double 和 float
对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位.但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言 ...
- ftp服务配置文件记录
因为南京的客户死活要ftp服务而不是sftp,所以我作手用vsftp作为服务器,尝试在windows ftp软件登录进去,特记录vsftp的用法. 配置文件在/etc/vsftpd.conf 有如下代 ...
- VC++ CString类完美总结(整理)
CString 是编程中一种非常有用的数据类型,它是MFC中的一个类,很大程度上简化了MFC中的许多字符串的操作. CString位于头文件afx.h中. ①.CString 类对象的初始化: CSt ...
- C Primer Plus_第8章_字符输入输出和输入确认_编程练习
1.题略 #include <stdio.h> int main(void) { ; printf("Please enter text here(end with Ctrl + ...