POJ 1236 Network of Schools 强连通分量+缩点

POJ 1236 Network of Schools

 

题意:问,对于一个DAG(又向无环图): 
1.至少要选几个点,才能从这些点出发到达所有点 
2.至少加入几条边,就能从图中任何一个点出发到达所有点

根据有用定理:有向无环图中所有入度不为0的点,一定 可以由某个入度为0的点出发可达。 (由于无环,所以从任何入度不为0的 点往回走,必然终止于一个入度为0的 点)

先求DAG的强连通分量数,再缩点,可以用tarjan算法来做。

第一个问题:不难想到答案就是缩点之后入度为0的点的个数

第二个问题:设缩点后入度为0的个数是n,出度为0的个数是m,至少添加边的条数就是max(n,m)

 

 

 POJ 1236 Network of Schools 强连通分量+缩点_第1张图片POJ 1236 Network of Schools 强连通分量+缩点_第2张图片

 POJ 1236 Network of Schools 强连通分量+缩点_第3张图片

POJ 1236 Network of Schools 强连通分量+缩点_第4张图片

POJ 1236 Network of Schools 强连通分量+缩点_第5张图片

 

#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=1100;
int dfn[maxn],low[maxn],vis[maxn],color[maxn],Stack[maxn];
int n,index,len,cnt;
vectorg[maxn];
int in[maxn],out[maxn],vis1[maxn];
void tarjan(int u)
{
	dfn[u]=low[u]=++index;
	Stack[cnt++]=u;//cnt++  需要注意 
	vis[u]=1;
	for(int i=0;i

 

你可能感兴趣的:(图------强连通分量)