题意:给出每个学校的list 代表该学校能链接的其他学校,问1:至少给几个学校资源使所有学校都得到;2:至少加多少个边能让所有学校相互连通;

思路:1:找出缩点后入度为零的点个数  2:找出缩点后入度为零个数和出度为零个数之间的最大值。

这题主要是在思考出入度和连通间的关系,了解了这个关系后就很水了。同时要注意图一开始就连通的情况。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std; #define MAXN 10100
#define MAXM 10100 struct Edge
{
int v, next;
}edge[MAXM]; //边结点数组 int first[MAXN], stack[MAXN], DFN[MAXN], Low[MAXN], Belong[MAXM];
int indegree[MAXN],outdegree[MAXN];
// first[]头结点数组,stack[]为栈,DFN[]为深搜次序数组,Belong[]为每个结点所对应的强连通分量标号数组
// Low[u]为u结点或者u的子树结点所能追溯到的最早栈中结点的次序号
int instack[10010]; // instack[]为是否在栈中的标记数组
int n, m, cnt, scnt, top, tot; void init()
{
cnt = 0;
scnt = top = tot = 0; //初始化连通分量标号,次序计数器,栈顶指针为0
memset(first, -1, sizeof(first));
memset(DFN, 0, sizeof(DFN)); //结点搜索的次序编号数组为0,同时可以当是否访问的数组使用
memset(indegree,0,sizeof(indegree));
memset(outdegree,0,sizeof(outdegree));
} void read_graph(int u, int v) //构建邻接表
{
edge[tot].v = v;
edge[tot].next = first[u];
first[u] = tot++;
} void Tarjan(int v) //Tarjan算法求有向图的强连通分量
{
int min, t;
DFN[v] = Low[v] = ++tot; //cnt为时间戳
instack[v] = 1; //标记在栈中
stack[top++] = v; //入栈
for(int e = first[v]; e != -1; e = edge[e].next)
{ //枚举v的每一条边
int j = edge[e].v; //v所邻接的边
if(!DFN[j])
{ //未被访问
Tarjan(j); //继续向下找
if(Low[v] > Low[j]) Low[v] = Low[j]; // 更新结点v所能到达的最小次数层
}
else if(instack[j] && DFN[j] < Low[v])
{ //如果j结点在栈内,
Low[v] = DFN[j];
}
}
if(DFN[v] == Low[v])
{ //如果节点v是强连通分量的根
scnt++; //连通分量标号加1
do
{
t = stack[--top]; //退栈
instack[t] = 0; //标记不在栈中
Belong[t] = scnt; //出栈结点t属于cnt标号的强连通分量
}while(t != v); //直到将v从栈中退出
}
} void solve()
{
for(int i = 1; i <= n; i++) //枚举每个结点,搜索连通分量
if(!DFN[i]) //未被访问
Tarjan(i); //则找i结点的连通分量
}
int e1[MAXN];int e2[MAXN];
int main()
{
scanf("%d",&n);
init();
for(int i=1;i<=n;i++)
{
int v;
while(scanf("%d",&v),v!=0)
{
e1[tot]=i;
e2[tot]=v;
read_graph(i, v);
}
}
solve(); //求强连通分量
for(int i=0;i<tot;i++)
{
if(Belong[e1[i]]!=Belong[e2[i]])
{
indegree[Belong[e2[i]]]++;
outdegree[Belong[e1[i]]]++;
}
}
int in,out,ans;
in=0;out=0;ans=0;
for(int i=1;i<=scnt;i++)
{
if(indegree[i]==0)
in++;
if(outdegree[i]==0)
out++;
}
printf("%d\n",in);
if(scnt==1)
printf("0\n");
else
{
ans=max(in,out);
printf("%d\n",ans);
}
return 0;
}

poj1236强连通缩点的更多相关文章

  1. poj1236 强连通缩点

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15211   Accepted: 60 ...

  2. poj2553 强连通缩点

    The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10114   Accepted: ...

  3. hdu 4635 Strongly connected 强连通缩点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...

  4. poj1236 强连通

    题意:有 n 个学校每个学校可以将自己的软件共享给其他一些学校,首先,询问至少将软件派发给多少学校能够使软件传播到所有学校,其次,询问添加多少学校共享关系可以使所有学校的软件能够相互传达. 首先,第一 ...

  5. BZOJ 1051: [HAOI2006]受欢迎的牛 强连通缩点

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1051 题解: 强连通缩点得到DAG图,将图转置一下,对入度为零的点跑dfs看看能不能访问 ...

  6. hdu 2767 Proving Equivalences 强连通缩点

    给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进 ...

  7. UVA - 11324 The Largest Clique 强连通缩点+记忆化dp

    题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...

  8. poj-1904(强连通缩点)

    题意:有n个王子,每个王子都有k个喜欢的女生,王子挑选喜欢的女生匹配,然后再给你n个王子最开始就定好的匹配,每个王子输出能够结合且不影响其他王子的女生匹配 解题思路:强连通缩点,每个王子与其喜欢的女生 ...

  9. NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序

    原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...

随机推荐

  1. Python 实现排序算法

    排序算法 下面算法均是使用Python实现: 插入排序 原理:循环一次就移动一次元素到数组中正确的位置,通常使用在长度较小的数组的情况以及作为其它复杂排序算法的一部分,比如mergesort或quic ...

  2. java正则表达式提取地址中的ip和端口号

    由于我需要用到java正则表达式提取地址中的ip和端口号,所以我就写了一个demo,测试一下,下面是demo public class Test0810_1 { public static void ...

  3. Eclipse中将hadoop项目放在集群中运行

    1.加入配置文件到项目源码目录下(src) <configuration> <property> <name>mapreduce.framework.name< ...

  4. 【新发现】不用苹果开发账号就能申请ios证书真机调试

    虽然xcode现在可以免证书进行测试了,但众多跨平台开发者,如果还没注册苹果开发者账号. 想安装到自己非越狱手机测试是无能为力了. 不过新技术来了,只需要普通免费的苹果账号无需付费成为开发者就可以申请 ...

  5. Oracle的安装问题

    1. 安装时提示:unable to create directory: /u01/oracle/oradata 这个是由于以oracle用户进行安装时,之前没有创建/u01/这个目录,要知道orac ...

  6. 关于excel的导入导出

    目前为方便操作,很多系统都增加了批量导入导出的功能.文件导入导出一般的格式都是excel,现将常用设计用例总结如下:   批量导入 一.模板检查检测:一般excel导入,都会提供模板下载功能 1.模板 ...

  7. Spring与Quartz的整合实现定时任务调度(转)

    最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考.我使用的是Maven来管理项目,需要的Jar包我给大家贴出 ...

  8. linux桌面创建快捷方式

    1使用命令行创建桌面快捷方式 要为特定程序或命令创建桌面快捷方式,你可以使用任意文本编辑器创建一个.desktop文件,然后把它放到/usr/share/applications或者~/.local/ ...

  9. 【Ubuntu Desktop】安装主流桌面

    ubuntu的桌面环境实在多,在这里选了几款主流的桌面环境,大家可以按需安装使用. 1.GNOME 2 Classic 经典老界面 gnome2   after reboot,choose GNOME ...

  10. centos开放端口8080

    今天购买了云服务器,玩耍一下,配置好了jdk和tomcat后,发现访问不了8080端口,telnet 不通,由此想到了防火墙挡住了. 配置规则: iptables -I INPUT -p tcp -- ...