tarjan求割点

洛谷P3388 【模板】割点(割顶)

#include
#include
using namespace std;
const int maxn=100009;
struct node {
    int to,nxt;
} e[2*maxn];
int n,m,cnt=0,index=0,head[maxn],dfn[maxn],low[maxn],iscut[maxn],ans=0;
void add(int u,int v) {
    e[++cnt].to=v;
    e[cnt].nxt=head[u];
    head[u]=cnt;
}
void tarjan(int u,int fa) {
    int child=0;
    dfn[u]=low[u]=++index;
//	cout<<"dfs  "<0; i=e[i].nxt) {
        int v=e[i].to;
        if(!dfn[v]) {
            child++;
            tarjan(v,u);
            low[u]=min(low[u],low[v]);
            if(fa>0&&low[v]>=dfn[u]) {
                if(!iscut[u])++ans;//一个顶点可能被标记多次
                iscut[u]=1;
                //	cout<<"df u"<1) {
        //if(!iscut[u])
        ++ans;//根节点不可能被统计多次
        iscut[u]=1;
        //	cout<<"fa "<>n>>m;
    int u,v;
    for(int i=1; i<=m; i++) {
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    for(int i=1; i<=n; i++)
        if(!dfn[i])tarjan(i,-1);
    printf("%d\n",ans);
    for(int i=1; i<=n; i++)
        if(iscut[i])cout<

poj2117,题目大意,给定一个图,删除一个点后,最多有多少连通块。
三种情况:
1:所有点是独立点,总数-1;
2:没有割点
3:删除链接儿子数最多的割点。
参考代码:
#include
#include
#include
using namespace std;
const int maxn=10009;
struct node {
	int to,nxt;
} e[20*maxn];
int n,m,cnt=0,index=0,head[maxn],dfn[maxn],low[maxn],iscut[maxn],ans=0;
void add(int u,int v) {
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
int tarjan(int u,int fa) {
	int child=0;
	dfn[u]=low[u]=++index;
//	cout<<"dfs  "<0; i=e[i].nxt) {
		int v=e[i].to;
		if(!dfn[v]) {
			child++;
			tarjan(v,u);
			low[u]=min(low[u],low[v]);
			if(fa>0&&low[v]>=dfn[u])
				iscut[u]++;
		} else if(dfn[v]


你可能感兴趣的:(tarjan)