B - Network - uva 315(求割点)

题意:给一个无向连通图,求出割点的数量。

首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第一个数字代表后面的都和它存在边,0表示行输入的结束(很蛋疼的输入方式).

分析:割点的模板题

******************************************************************

#include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
using namespace std;

const int MAXN = 105;

struct Edge{int v, next;}e[MAXN*MAXN];
int Head[MAXN], cnt;
void AddEgde(int u, int v)
{
    e[cnt].v = v;
    e[cnt].next = Head[u];
    Head[u] = cnt++;
}

int f[MAXN], nRootSons;///记录父亲节点,和根节点的子树个数
int blsCutVetext[MAXN];///是否属于割点
int Low[MAXN], Dfn[MAXN], Index;///low保存深搜最早能够到达的点

void InIt(int N)///初始化
{
    cnt = nRootSons = Index = 0;
    for(int i=0; i<=N; i++)
    {
        Head[i] = -1;
        blsCutVetext[i] = false;
        Dfn[i] = false;
    }
}
void Tarjan(int u, int father)
{
    f[u] = father;
    Low[u] = Dfn[u] = ++Index;

for(int j=Head[u]; j!=-1; j=e[j].next)
    {
        int v = e[j].v;
        if( !Dfn[v] )
        {
            Tarjan(v, u);
            Low[u] = min(Low[u], Low[v]);
        }
        else if( v != father)
            Low[u] = min(Low[u], Dfn[v]);
    }
}

int main()
{
    int N;

while(scanf("%d", &N), N)
    {
        int i, u, v; char End;

InIt(N);

while(scanf("%d", &u), u)
        {
            while(1)
            {
                scanf("%d%c", &v, &End);
                AddEgde(u, v);
                AddEgde(v, u);

if(End == ‘\n‘)
                    break;
            }
        }

Tarjan(1, 0);

for(i=1; i<=N; i++)
        {
            u = f[i];
            if(u == 1)
                nRootSons++;
            else if( Dfn[u] <= Low[i] )
                blsCutVetext[u] = true;
        }

if(nRootSons > 1)
            blsCutVetext[1] = true;

int ans = 0;

for(i=1; i<=N; i++)
        {
            if(blsCutVetext[i] == true)
                ans++;
        }

printf("%d\n", ans);
    }

return 0;

}

时间: 2024-10-25 12:07:28

B - Network - uva 315(求割点)的相关文章

UVA 315 求割点数

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=251 测模版: #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <queue> #includ

uva 315 Network(连通图求割点)

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=251  Network  A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places numbered by integers

UVA 315 Network(无向图求割点)

题目大意 A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places numbered by integers from 1 to N. No two places have the same number. The lines are bidirectional and always connect together two pl

UVA - 315 Network(tarjan求割点的个数)

题目链接:https://vjudge.net/contest/67418#problem/B 题意:给一个无向连通图,求出割点的数量.首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第一个数字代表后面的都和它存在边,0表示行输入的结束. 题解:简单的求割点模版,所谓割点就是去掉这一个点还有于这个点链接的边之后使得原来的图连通块增加. 由于这是模版题代码会加上注释. #include <iostream> #include <cstring> using namesp

Uva 315 求无向图的割点的个数

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=251 A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places numbered by integers from 1 to 

UVA 315 求连通图里的割点

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20837 哎 大白书里求割点的模板不好用啊,许多细节理解起来也好烦..还好找了另一份模板 请注意,这道题里的每组数据都是只有一组连通图的 #include <iostream> #include <cstdio> #include <vector> #include <cstring> using namespace std; const

[UVA315]Network(tarjan, 求割点)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=251 求割点,除了输入用strtok和sscanf处理输入以外,对于求割点的tarjan算法有了进一步理解. 特别注意88行,如果u是根并且至少两个儿子,那它一定是割点无误,还有第二个情况用如图代表: 这个例子里显然:low[4]=2,dfn[4]=4,dfn[3]=3.现dfs到

poj1144 Network【tarjan求割点】

转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4319585.html   ---by 墨染之樱花 [题目链接]http://poj.org/problem?id=1144 [题目描述](半天才看明白...)给图求割点个数 [思路]直接套求割点的模板即可,就是要注意输入比较坑.代码见下,附注释 #include <iostream> #include <ios> #include <iomanip> #includ

POJ 1144 Network(无向图连通分量求割点)

题目地址:POJ 1144 求割点.推断一个点是否是割点有两种推断情况: 假设u为割点,当且仅当满足以下的1条 1.假设u为树根,那么u必须有多于1棵子树 2.假设u不为树根.那么(u,v)为树枝边.当Low[v]>=DFN[u]时. 然后依据这两句来找割点就能够了. 代码例如以下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include &

POJ 1144 Network(强连通分量求割点)

题目地址:POJ 1144 求割点.判断一个点是否是割点有两种判断情况: 如果u为割点,当且仅当满足下面的1条 1.如果u为树根,那么u必须有多于1棵子树 2.如果u不为树根,那么(u,v)为树枝边,当Low[v]>=DFN[u]时. 然后根据这两句来找割点就可以了. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <