poj 1236 Network of Schools (强连通分量+缩点)
题目大概:
每个学校都可以把软件复制好,交给它名单上的学校。
问题A:把软件复制成几份,然后交给不同的学校,所有学校才能够都有软件。
问题B:添加几条边,能使得这个图变成强连通图。
思路:
找出所有的强连通分量,然后缩点,变成一个新有向无环图,求每个强连通分量的入度和出度。
A:入度是0的点就是复制的最小数量,因为只要给强连通分量一个软件,他就会传到每个点,所以找出没有入口的强连通分量的数量就是要复制的数量(其他强连通分量都可以由这些分量传递过去)。
B:in0为入度为0点的数量,out0出度为0的点的数量,添加的边的数量是=max(in0,out0);这个不好证明,但画一下图,自己理解一下,也是很容易理解的。
KO:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a)) const int N=;
vector<int>g[N];
vector<int>rg[N];
vector<int>vs;
bool vis[N];
int cmp[N];
int in[N]={};
int out[N]={};
int n,a; void add_edge(int u,int v)
{
g[u].pb(v);
rg[v].pb(u);
} void dfs(int u)
{
vis[u]=true;
for(int i=;i<g[u].size();i++)if(!vis[g[u][i]])dfs(g[u][i]);
vs.pb(u);
} void rdfs(int u,int k)
{
vis[u]=true;
cmp[u]=k;
for(int i=;i<rg[u].size();i++)if(!vis[rg[u][i]])rdfs(rg[u][i],k);
} int scc()
{
mem(vis,false);
vs.clear();
for(int i=;i<=n;i++)if(!vis[i])dfs(i); mem(vis,false);
int k=;
for(int i=vs.size()-;i>=;i--)if(!vis[vs[i]])rdfs(vs[i],k++);
return k;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(); cin>>n;
for(int i=;i<=n;i++)
{
while(cin>>a&&a)add_edge(i,a);
} int t=scc();
for(int i=;i<=n;i++)
{
for(int j=;j<g[i].size();j++)
if(cmp[i]!=cmp[g[i][j]])out[cmp[i]]++,in[cmp[g[i][j]]]++;
}
int in1=,out1=;
for(int i=;i<t;i++)
{
//cout<<in[i]<<' '<<out[i]<<endl;
if(in[i]==)in1++;
if(out[i]==)out1++;
} cout<<in1<<endl;
if(t==)cout<<<<endl;
else cout<<max(in1,out1)<<endl;
return ;
}
TA:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector> using namespace std; const int maxn = + ; int N;
int In[maxn], Out[maxn]; /***************************Tarjan算法模板***************************/
vector<int> G[maxn];
int Mark[maxn], Root[maxn], Stack[maxn]; //时间戳,根(当前分量中时间戳最小的节点),栈
bool Instack[maxn]; //是否在栈中标记
int Ssc[maxn]; //每个节点所在的强连通分量的编号
int Index, Ssc_n, Top; //搜索时用的时间戳,强连通分量总数,栈顶指针 void Tarjan(int u) //u 当前搜索到的点
{
Mark[u] = Root[u] = ++ Index; //每找到一个点,对时间戳和根初始化
Stack[Top ++] = u; //压栈
Instack[u] = true; //在栈中标记 int v; for(int i= ; i< G[u].size(); i++) //向下搜索
{
v = G[u][i];
if(Mark[v] == ) //没到过的点
{
Tarjan(v); //先向下搜索
if(Root[u] > Root[v]) Root[u] = Root[v]; //更新根
}
else if(Instack[v] && Root[u] > Mark[v]) Root[u] = Mark[v]; //到过的点且点仍在栈中,试着看这个点能不能成为根
}
/*对当前点的搜索结束*/
if(Mark[u] == Root[u]) //当前点本身时根
{
Ssc_n ++; //更新强连通分量数 do{ //栈中比它后入栈的元素在以它为根的强连通分量中
v = Stack[-- Top];
Instack[v] = false;
Ssc[v] = Ssc_n;
}while(v != u); //直到它自己
}
} void SSC()
{
memset(Mark, , sizeof Mark); //初始化时间戳和栈内标记
memset(Instack, false, sizeof Instack);
Index = Ssc_n = Top = ; //初始化时间戳,强连通分量数,栈顶指针 for(int i= ; i<= N; i++) //保证图上所有点都访问到
if(Mark[i] == ) Tarjan(i);
}
/***************************Tarjan算法模板***************************/ int main()
{
//freopen("in.txt", "r", stdin); scanf("%d", &N);
for(int i= ; i<= N; i++)
{
int x;
while(scanf("%d", &x), x)
G[i].push_back(x);
} SSC(); if(Ssc_n == ) //只有一个强连通分量的情况
{
cout << "1\n0\n";
return ;
} memset(In, , sizeof In); //求每个强连通分量的入度和出度
memset(Out, , sizeof Out);
for(int u= ; u<= N; u++)
{
for(int i= ; i< G[u].size(); i++)
{
int v = G[u][i];
if(Ssc[u] != Ssc[v])
Out[Ssc[u]] ++, In[Ssc[v]] ++;
}
} int S1 = , S2 = ; //找入度为0、出度为0的点的数目
for(int i= ; i<= Ssc_n; i++)
{
if(In[i] == ) S1 ++;
if(Out[i] == ) S2 ++;
} cout << S1 << endl << max(S1, S2) << endl; return ;
}
poj 1236 Network of Schools (强连通分量+缩点)的更多相关文章
- POJ 1236 Network Of Schools (强连通分量缩点求出度为0的和入度为0的分量个数)
Network of Schools A number of schools are connected to a computer network. Agreements have been dev ...
- POJ 1236 Network of Schools (强连通分量缩点求度数)
题意: 求一个有向图中: (1)要选几个点才能把的点走遍 (2)要添加多少条边使得整个图强联通 分析: 对于问题1, 我们只要求出缩点后的图有多少个入度为0的scc就好, 因为有入度的scc可以从其他 ...
- POJ1236 Network of Schools —— 强连通分量 + 缩点 + 入出度
题目链接:http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS Memory Limit: 10000K Tot ...
- POJ 1236 Network of Schools(Tarjan缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16806 Accepted: 66 ...
- Network of Schools(强连通分量缩点(邻接表&矩阵))
Description A number of schools are connected to a computer network. Agreements have been developed ...
- poj 1236 Network of Schools(tarjan+缩点)
Network of Schools Description A number of schools are connected to a computer network. Agreements h ...
- Network of Schools(强连通分量+缩点) (问添加几个点最少点是所有点连接+添加最少边使图强连通)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13801 Accepted: 55 ...
- poj~1236 Network of Schools 强连通入门题
一些学校连接到计算机网络.这些学校之间已经达成了协议: 每所学校都有一份分发软件的学校名单("接收学校"). 请注意,如果B在学校A的分发名单中,则A不一定出现在学校B的名单中您需 ...
- POJ 1236 Network of Schools(强连通 Tarjan+缩点)
POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意: 给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...
- POJ 1236 Network of Schools(强连通分量)
POJ 1236 Network of Schools 题目链接 题意:题意本质上就是,给定一个有向图,问两个问题 1.从哪几个顶点出发,能走全全部点 2.最少连几条边,使得图强连通 思路: #inc ...
随机推荐
- Codechef Union on Tree
Codechef Union on Tree https://www.codechef.com/problems/BTREE 简要题意: 给你一棵树,\(Q\)次询问,每次给出一个点集和每个点的\(r ...
- BZOJ3700: 发展城市
BZOJ3700: 发展城市 https://lydsy.com/JudgeOnline/problem.php?id=3700 分析: 枚举两个人,先求链交,求到两个端点的时间. 链交求法:求两两\ ...
- ACM学习历程—HDU 5534 Partial Tree(动态规划)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5534 题目大意是给了n个结点,让后让构成一个树,假设每个节点的度为r1, r2, ...rn,求f(x ...
- ACM学习历程—HDU5476 Explore Track of Point(平面几何)(2015上海网赛09题)
Problem Description In Geometry, the problem of track is very interesting. Because in some cases, th ...
- Nested loops、Hash join、Sort merge join(三种连接类型原理、使用要点)
nested loop 嵌套循环(原理):oracle从较小结果集(驱动表.也可以被称为outer)中读取一行,然后和较大结果集(被侦查表,也可以叫做inner)中的所有数据逐条进行比较(也是等值连接 ...
- Python之常用模块(二)
shelve xml处理 configparser hashlib logging shelve模块 shelve是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持 ...
- ZAB与Paxos算法的联系与区别
ZAB协议并不是Paxos算法的一个典型实现,在讲解ZAB和Paxos之间的区别之前,我们首先来看下两者的联系. 两者都存在一个类似于Leader进程的角色,由其负责协调多个Follow进程的运行. ...
- Java常见设计模式之代理模式
指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其它相关业务的处理.比如生活中的通过代理访问网络,客户通过网络代理连接网络(具体业务),由代理服务器完成用户权限和访问限制等与 ...
- C# 播放音乐
用 .NET 自带的类库 System.Media 下面的 SoundPlayer 来播放音乐的方式,此种方式使用托管代码,应该是更为可取的方式吧 使用起来非常简单,下面稍作说明: . 支持同步.异步 ...
- python的WeakKeyDictionary类和weakref模块的其他函数
python的WeakKeyDictionary类和weakref模块的其他函数 # -*- coding: utf-8 -*- # @Author : ydf # @Time : 2019/6/13 ...