poj1236 有线图的强连通分量 tarjan算法判断

poj1236 有线图的强连通分量 tarjan算法判断/*

/*
总结:这道题开始做的时候思路是正确的,但是我是把它当成无线图处理了
但是这道题是有向图,有向图的连通判断是tarjan算法和kosaraju算法判断几个强连通分量
无向图就是判断判断是否连通,一般有两种方法判断无向图
1;并查集
2;搜索,bfs,dfs; 
这道题判断强连通分量,然后是缩点,将一个强连通分量变成一个点,那么就变成有向无环图DAG
textA的答案就是DAG中入度为零点的个数;textB的答案就是加边,就是出度为零的点加边到入度为零的边
想一想树 顶点就是入度为零的  叶子点就是出度为零 我们连边就是一棵树的叶子点连上另一颗树的顶点;这样保证了最小加边
anxb=max(n,m); 
*/ 
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int MAXN=20010;
const int MAXM=50010;
struct Edge{
	int to,from;
}edge[MAXN];
vectorg[MAXN];
int head[MAXN],tot,In[MAXN],Out[MAXN];
int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];
int Index,top;
int scc;//强连通分量个数
bool Instack[MAXN];
int num[MAXN];//各个强连通分量包含点的个数,数组编号1~scc
void init(int n)
{
	tot=0;// 
	for(int i=1;i<=n;i++)
		g[i].clear();
} 
void addedge(int u,int v)
{
	edge[tot].from=u;edge[tot].to=v;g[u].push_back(tot++);
} 
void Tarjan(int u)
{
	int v;
	Low[u]=DFN[u]=++Index;//刚进入时两个时间点是相等的 因为都没有遍历过 
	Stack[top++]=u;
	Instack[u]=true;
	for(int i=0;i



你可能感兴趣的:(连通图)