UVA 315 :Network (无向图求割顶)

题目链接

题意:求所给无向图中一共有多少个割顶

用的lrj训练指南P314的模板

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=109;
struct Edge
{
    int to,next;
    Edge(){}
    Edge(int _to,int _next)
    {
        to=_to;
        next=_next;
    }
}edge[N*N*2];
int head[N];

int dfn[N],low[N];
int iscut[N];
int n,tot;
int time_tag;

void addedge(int u,int v)
{
    edge[tot]=Edge(v,head[u]);
    head[u]=tot++;
}

void init()
{
    memset(dfn,0,sizeof(dfn));
    memset(iscut,0,sizeof(iscut));
    memset(head,-1,sizeof(head));
    tot=time_tag=0;
}

void dfs(int u,int pre)
{
    low[u]=dfn[u]=++time_tag;
    int child=0;    //子节点数目
    for(int i=head[u];~i;i=edge[i].next)
    {
        int v=edge[i].to;
        if(!dfn[v])    //    把dfn[]当vis[]使用
        {
            child++;
            dfs(v,u);
            low[u]=min(low[u],low[v]);
            if(low[v]>=dfn[u])
                iscut[u]=1;
        }
        else if(dfn[v]<dfn[u] && v!=pre)
            low[u]=min(low[u],dfn[v]);
    }
    if(pre<0&&child==1) iscut[u]=0;    //只有一个孩子的根节点
}

int main()
{
    while(scanf("%d",&n)>0&&n)
    {
        init();
        int u,v;
        while(scanf("%d",&u)>0&&u)
        {
            while(getchar()!=‘\n‘)
            {
                scanf("%d",&v);
                addedge(u,v);
                addedge(v,u);
            }
        }
        dfs(1,-1);
        int ans=0;
        for(int i=1;i<=n;i++)
            if(iscut[i]) ans++;
        printf("%d\n",ans);
    }
}
时间: 2024-10-07 05:27:12

UVA 315 :Network (无向图求割顶)的相关文章

无向图求割顶与桥

无向图求割顶与桥 对于无向图G,如果删除某个点u后,连通分量数目增加,称u为图的关节点或割顶.对于连通图,割顶就是删除之后使图不再连通的点.如果删除边(u,v)一条边,就可以让连通图变成不连通的,那么边(u,v)是桥. 具体的概念和定义比较多,在刘汝佳<<训练指南>>P312-314页都有详细的介绍. 下面来写求无向图割顶和桥的DFS函数.我们令pre[i]表示第一次访问i点的时间戳,令low[i]表示i节点及其后代所能连回(通过反向边)的最早祖先的pre值. 下面的dfs函数返回

poj 1144 Network【无向图求割顶模板题】

Description 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

POJ 1144 &amp; Uva 315 Network 【求割点数目】

Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10855   Accepted: 5020 链接:http://poj.org/problem?id=1144 Description A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places

无向图求割顶和桥总结

1.求能够分成几个联通分量什么的一般都在dfs中间那里if(...>...) cnt[i],iscut[i]维护一下就OK了. 2.根结点特别需要注意. 好像就没了→_→

无向图求割顶双连通分量

poj1144: 模板题,不过输入的方式真的真的是非常非常蛋疼...记住了... 1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 #define rep(i,n) for(int i=1;i<=n;i++) 8 #define clr(x,

UVA - 315 Network 和 UVA - 10199 (求割顶)

链接 :  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20837 http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21278 求割顶的裸题. UVA - 315 #include <algorithm> #include <iostream> #include <sstream> #include <cstrin

图论(无向图的割顶):POJ 1144 Network

Network Description 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

无向图的割顶(poj1523,1144)

割顶:表示无向图中的点,这个点删除之后,原图不在联通,这样的点就是割顶. 怎么求一个图中的割顶呢? 把无向图变成一颗树,dfs时候搜索到在dfs树上的称为树边,搜索是出现后代指向祖先的边称为反向边. 对于根节点,当他存在两个或两个以上的子节点时,那么他就是割顶. 而对于其他节点u,当且仅当u存在一个子节点v,使得v及其所有的后代都没有反向边连回u的祖先时,u是一个割顶. 那么判断就很简单,这里给出两个模板: 题目:poj1523 和 1144都是裸的求割顶的题目 通用模板: #include <

【模板】无向图的割顶

无向图的割顶: Vector <int> G[] :邻接表存图 Int pre[] :存储时间戳 Int low[] : u及其后代所能连回的最早的祖先的pre值 Int iscut[] : =true表示是割顶,=false不是割顶 Dfs函数在主函数调用时,fa预设为-1. vector <int> G[MAXN]; int pre[MAXN],iscut[MAXN],low[MAXN],dfs_clock; int dfs(int u,int fa) { int lowu=p