B - Network - uva 315(求割点)

题意:给一个无向连通图,求出割点的数量。
首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第一个数字代表后面的都和它存在边,0表示行输入的结束(很蛋疼的输入方式).
分析:割点的模板题
******************************************************************
#include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
using namespace std; const int MAXN = ; 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 = ;
    for(int i=; i<=N; i++)
    {
        Head[i] = -;
        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!=-; 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()
            {
                scanf("%d%c", &v, &End);
                AddEgde(u, v);
                AddEgde(v, u);                 if(End == '\n')
                    break;
            }
        }         Tarjan(, );         for(i=; i<=N; i++)
        {
            u = f[i];
            if(u == )
                nRootSons++;
            else if( Dfn[u] <= Low[i] )
                blsCutVetext[u] = true;
        }         if(nRootSons > )
            blsCutVetext[] = true;         int ans = ;         for(i=; i<=N; i++)
        {
            if(blsCutVetext[i] == true)
                ans++;
        }         printf("%d\n", ans);
    }     return ; } 
上一篇:Ubuntu下访问Windows中Postgresql


下一篇:sql查询单个银行账号重复