大意:求割顶的数量以及删除割顶之后子图的数量。

思路:Tarjan算法求割顶,同POJ 1144 NetWork.

CODE1:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;

const int MAXN = 100010;
const int MAXM = 500010;

struct Edge
{
    int v, next;
}edge[MAXM];

int dfn[MAXN], low[MAXN], sub[MAXN];
int first[MAXN];
int N, M;
int cnt, tot;
int u, v;

void read_graph(int u, int v)
{
    edge[cnt].v = v;
    edge[cnt].next = first[u], first[u] = cnt++;
}

void init()
{
    cnt = 0;
    tot = 0;
    memset(first, -1, sizeof(first));
    memset(dfn, 0, sizeof(dfn));
}

void read_graph2()
{
    scanf("%d", &v);
    read_graph(u, v);
    read_graph(v, u);
    N = max(N, max(u, v));
    while(scanf("%d", &u) && u)
    {
        scanf("%d", &v);
        read_graph(u, v);
        read_graph(v, u);
        N = max(N, max(u, v));
    }
}

void tarjan(int u)
{
    dfn[u] = low[u] = ++tot;
    for(int e = first[u]; e != -1; e = edge[e].next)
    {
        int v = edge[e].v;
        if(!dfn[v])
        {
            tarjan(v);
            low[u] = min(low[u], low[v]);
            if(dfn[u] <= low[v]) sub[u]++;
        }
        low[u] = min(low[u], dfn[v]);
    }
}

void solve(int root)
{
    for(int i = 1; i <= N; i++)    sub[i] = (i == root)? 0:1; //直接将根节点赋值为0
    tarjan(root);
    int flag = 0;
    for(int i = 1; i <= N; i++)
    {
        if(sub[i] > 1)
        {
            flag = 1;
            printf("  SPF node %d leaves %d subnets\n", i, sub[i]);
        }
    }
    if(!flag)
        printf("  No SPF nodes\n");
}

int main()
{
    int times = 0;
    while(scanf("%d", &u) && u)
    {
        init();
        read_graph2();
        if(times) printf("\n");
        printf("Network #%d\n", ++times);
        solve(1);
    }
    return 0;
}

CODE2:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;

const int MAXN = 100010;
const int MAXM = 500010;

struct Edge
{
    int v, next;
}edge[MAXM];

int dfn[MAXN], low[MAXN], sub[MAXN];
int first[MAXN];
int N, M;
int cnt, tot;
int u, v;
int root = 1;

inline void read_graph(int u, int v)
{
    edge[cnt].v = v;
    edge[cnt].next = first[u], first[u] = cnt++;
}

inline void init()
{
    cnt = 0;
    tot = 0;
    memset(first, -1, sizeof(first));
    memset(dfn, 0, sizeof(dfn));
}

inline void read_graph2()
{
    scanf("%d", &v);
    read_graph(u, v);
    read_graph(v, u);
    N = max(N, max(u, v));
    while(scanf("%d", &u) && u)
    {
        scanf("%d", &v);
        read_graph(u, v);
        read_graph(v, u);
        N = max(N, max(u, v));
    }
}

inline void Tarjan(int u, int fa)
{
    int rootson = 0;
    low[u] = dfn[u] = ++tot;
    for(int e = first[u]; e != -1; e = edge[e].next)
    {
        int v = edge[e].v;
        if(!dfn[v])
        {
            if(u == root) //处理根节点。 
            {
                if(++rootson > 1) sub[u]++;
            }
            Tarjan(v, u);
            low[u] = min(low[u], low[v]);
            if(u != root && dfn[u] <= low[v]) sub[u]++; //根节点已经被处理过。
        }
        low[u] = min(low[u], dfn[v]);
    }
}

inline void solve()
{
    int flag = 0;
    for(int i = 1; i <= N; i++) sub[i] = 1;
    Tarjan(root, -1);
    for(int i = 1; i <= N; i++)
    {
        if(sub[i] > 1)
        {
            flag = 1;
            printf("  SPF node %d leaves %d subnets\n", i, sub[i]);
        }
    }
    if(!flag) printf("  No SPF nodes\n");
}

int main()
{
    int times = 0;
    while(scanf("%d", &u) && u)
    {
        init();
        read_graph2();
        if(times) printf("\n");
        printf("Network #%d\n", ++times);
        solve();
    }
    return 0;
}

转载于:https://www.cnblogs.com/g0feng/archive/2012/11/03/2752321.html

POJ 1523 SPF相关推荐

  1. poj 1523 SPF (无向图 的 割点)

    http://poj.org/problem?id=1523 题意:  求  无向图的 个点,以及 将个点 去掉后  图 被分成 几个联通块: 题解:  tarjan   .   1 #include ...

  2. POJ 1523 SPF 割点与桥的推断算法-Tarjan

    题目链接: POJ1523 题意: 问一个连通的网络中有多少个关节点,这些关节点分别能把网络分成几部分 题解: Tarjan 算法模板题 顺序遍历整个图,能够得到一棵生成树: 树边:可理解为在DFS过 ...

  3. POJ 1523 SPF (割点 点双连通分量)

    题意:求出割点以及除去割点后的连通分量的数量(附带求出了点双连通分量(块)) [求割点]对图深度优先搜索,定义DFS(u)为u在搜索树(以下简称为树)中被遍历到的次序号.定义Low(u)为u或u的子树 ...

  4. 【POJ - 1523】SPF(Tarjan求割点,求分割成的连通块数,模板题,tricks)

    题干: Consider the two networks shown below. Assuming that data moves around these networks only betwe ...

  5. POJ 1523 (割点+连通分量)

    题目链接: http://poj.org/problem?id=1523 题目大意:连通图,找图中割点,并计算切除该割点后,图中的连通分量个数. 解题思路: POJ的数据很弱. Tarjan法求割点. ...

  6. poj 1523(无向联通图的割点)

    结合tarjan算法思想,这题终于写了出来. 同样用dfs将图变成为一颗树,这样可以提供许多有用的性质. 对于一个无向连通图,dfs后的树为只有回边(回边Euv,v是u的祖先)和生成树的边的图. 那么 ...

  7. [无向图割点] PKU 1523 SPF

    targan算法. 1 # include <cstdio> 2 # include <cstring> 3 4 # define N (1000 + 5) 5 6 int n ...

  8. 【Q】【poj 1144】【poj 1523】

    割点问题 题目类型相同,于是放到一起写.套了个版就可以了. 贴出版吧,方便查找. void dfs(int k, int fa){     int j, i, son = 0;     vis[k] ...

  9. 是否有HTML整洁化的插件,让所有的浏览器都能识别HTML5标签样式的小插件

    如今HTML5愈来愈引发大家的关注了,但目前支持HTML5的浏览器还不是主流,特别是国内用户近50%以上仍旧使用IE6,由于支持HTML5的IE9不支持Xp系统安装,这样未来很长一段时间,HTML5的 ...

最新文章

  1. lwip之数据收发流程_1
  2. Windows上的音频采集技术
  3. pt-osc原理、限制、及与原生online-ddl比较
  4. spring javaee_JavaEE还是Spring? 都不行! 我们呼吁新的竞争者!
  5. 深度神经网络关键词解释
  6. java split函数_Java split函数
  7. UIActionSheet的最后一项点击失效
  8. hadoop2.7.3用mapreduce计算pi值
  9. Python实践通过使用XGBoost中的尽早停止【Early Stopping】策略来避免过度拟合
  10. 世界顶级黑市拳赛内幕
  11. 施努卡:锂电池电芯底面和侧板的压胶面积
  12. 矩阵奇异值分解(详解)
  13. Springboot集成Screw生成数据库表结构文档
  14. Markdown编辑器使用-yellowcong
  15. Datawhale组队学习NLP之transformer Task 01
  16. 谷歌浏览器插入百度翻译插件
  17. 设计模式——中介模式
  18. linux系统删除lammps任务,Linux 的常用命令
  19. 信息系统项目管理师 - 项目立项管理
  20. Cast from pointer to smaller type 'int' loses information”

热门文章

  1. Windows Server 2008 R2之管理Sysvol文件夹
  2. jaquery ready
  3. 闲话WPF之二六(WPF性能优化点)
  4. 【Linux】【通信】1.ping不通
  5. Ubuntu上安装nginx步骤及问题记录
  6. js---html元素操作
  7. 不得不爱开源 Wijmo jQuery 插件集(4)-【手风琴效果】(附页面展示和源码)
  8. 终于来热风了,又一次感觉到什么叫温暖!
  9. GUI(一) 一些自已看的东西
  10. 【Android 逆向】Android 逆向工具 ( Apktool | IDA | Python )