【tarjan算法求割点】PKU-1523-SPF

原创 2012年03月30日 13:23:10
其实题目的数据不够规范,因为它的点可能不连续,而且数据里面一定有根节点1,这个在题目里体现不了!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
using namespace std;
#define N 1005
vector<int> vec[N];
int step,low[N],dfn[N],blg[N];
void add(int x,int y)
{
    vec[x].push_back(y);
    vec[y].push_back(x);
}
void tarjan(int now)
{
    low[now]=dfn[now]=step++;
    int len=vec[now].size();
    for(int i=0;i<len;i++)
    {
        int u=vec[now][i];
        if(dfn[u]==-1)
        {
            tarjan(u);
            if(dfn[now]<=low[u])blg[now]++;                 //产生一个连通分支
            else low[now]=min(low[now],low[u]);
        }
        else low[now]=min(low[now],dfn[u]);
    }
}
int main()
{
    //freopen("a.txt","r",stdin);
    int x,ca=1;
    while(scanf("%d",&x)&&x)
    {
        int y;
        scanf("%d",&y);
        for(int i=1;i<N;i++)vec[i].clear();
        add(x,y);
        while(scanf("%d",&x)&&x)
        {
            scanf("%d",&y);
            add(x,y);
        }
        memset(blg,0,sizeof(blg));
        memset(dfn,-1,sizeof(dfn));
        step=0;
        tarjan(1);
        printf("Network #%d\n",ca++);
        bool flag=false;
        for(int i=1;i<N;i++)
        {
            if(i!=1)blg[i]++;             //加上当前点的父节点的连通数,当这点是根节点时没有父节点,所以不能加1
            if(blg[i]<2)continue;
            flag=true;
            printf("  SPF node %d leaves %d subnets\n",i,blg[i]);
        }
        if(!flag)printf("  No SPF nodes\n");
        printf("\n");
    }
    return 0;
}


求割点模板(tarjan算法思路)

想看更多模板,请点击:http://blog.csdn.net/martinue/article/category/6268283 贴上求割点模板: const int N=110; struct d...
  • martinue
  • martinue
  • 2016年05月04日 14:08
  • 1537

Tarjan算法求解一个无向图中的割点和桥问题

基本概念割点:Articulation Point 在无向连通图中,删除一个顶点v及其相连的边后,原图从一个连通分量变成了两个或多个连通分量,则称顶点v为割点,同时也称关节点(Articulatio...
  • starstar1992
  • starstar1992
  • 2016年10月27日 13:29
  • 1536

Tarjan三大算法之双连通分量(割点,桥)

Robert Endre Tarjan是一个美国计算机学家,他传奇的一生中发明了无数算法,统称为Tarjan算法。其中最著名的有三个,分别用来求解 1) 无向图的双连通分量 2) 有向图的强连通分...
  • fuyukai
  • fuyukai
  • 2016年04月23日 11:25
  • 5105

tarjan算法应用之割边和割点

割边:在连通图中,删除了连通图的某条边后,图不再连通。这样的边被称为割边,也叫做桥。 割点:在连通图中,删除了连通图的某个点以及与这个点相连的边后,图不再连通。这样的点被称为割点。 DFS搜索树:用D...
  • qq_32400847
  • qq_32400847
  • 2016年07月21日 16:58
  • 902

关于tarjan算法的一些理解(割点割边)

首先介绍以下tarjan算法: ---------------------------------------------tarjan算法------------------------------...
  • qq_24451605
  • qq_24451605
  • 2015年07月20日 06:44
  • 2123

求桥和割点的Tarjan算法

low[u]定义为u或者u的子树中能够通过非父子边追溯到的最早的节点的DFS开始时间 dfn[u]表示dfs下u的开始时间 割点:无向连通图中,如果删除某点后,图变成不连通,则称该点为割点。 桥...
  • qq_34446253
  • qq_34446253
  • 2016年08月22日 14:47
  • 689

超详细Tarjan算法总结,求强连通分量,割点,割边,有重边的割边

Tarjan是一个人,他一身中发明了很多算法,就这几个算法最为出名。 1、求有向图的强连通分量,那么什么是强连通分量呢,就是一个顶点集合,任意两个顶点间都可以互相到达。如果图中任意两点可以互相到达,则...
  • lw277232240
  • lw277232240
  • 2017年06月14日 19:50
  • 434

用Tarjan算法求无向连通图割点&&割边

/** 割点割边挺好理解的,割点就是一个无向连通图,把其中一个点 挖掉剩下的图不连通,割边就是把一条边砍掉不连通 比如:有一个通信网络,要求一颗炸弹,把这个通信网络搞得不连通...
  • zcube
  • zcube
  • 2015年09月05日 10:11
  • 2425

tarjan算法求割点

图论:求割点(无向图中的概念) 回边:dfs过程中遇到已访问节点所经过的边观察dfs树,有两类节点可成为割点。 对非叶子节点u,若子树节点均无指向u的祖先节点的回边,说明删除u后,根节点与u的子树不在...
  • BeingLucky
  • BeingLucky
  • 2017年09月19日 23:27
  • 146

tarjan求强连通分量+缩点+割点以及一些证明

“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----《膜你抄》   自从听完这首歌,我就对tarjan开始心驰神往了,不过由...
  • tianwei0822
  • tianwei0822
  • 2018年01月13日 19:24
  • 104
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【tarjan算法求割点】PKU-1523-SPF
举报原因:
原因补充:

(最多只允许输入30个字)