POJ1144 Network(判断割点)

题目链接“点击打开链接

判断割点的个数

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
const int N = 210;
const int maxn = 500;
const int maxm = 21010;
const int inf = 1e8;
#define MIN INT_MIN
#define MAX 1e6
#define LL long long
#define init(a) memset(a,0,sizeof(a))
#define FOR(i,a,b) for(int i = a;i<b;i++)
#define max(a,b) (a>b)?(a):(b)
#define min(a,b) (a>b)?(b):(a)
using namespace std;

int DFN[maxn],low[maxn],head[maxn];
bool dian[maxn];
int bianhao,n,bnum,root,vis[maxn];
int gedian[maxn],ge;
struct edge
{
    int v,next;
}edge[maxm];

void add(int u,int v)
{
    edge[bnum].v=v;
    edge[bnum].next=head[u];
    head[u]=bnum++;
}

void tarjan(int u,int father)//判定割点
{
    int son=0;
    vis[u]=1;//标记
    DFN[u]=low[u]=bianhao++;
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].v;
        if(vis[v]==1 && v!=father)
            low[u]=min(low[u],DFN[v]);
        if(vis[v]==0)
        {
            tarjan(v,u);
            son++;
            low[u]=min(low[u],low[v]);
            if((u==root && son>1 ) || (u!=root && DFN[u]<=low[v]))//判定割点的条件
            {
               dian[u]=1;
            }
        }
    }
    vis[u]=2;//去掉
}
void initt()
{
        memset(head,-1,sizeof(head));
        init(DFN);init(low);
        init(vis);init(dian);
        bnum=0;bianhao = 1;//ge = 0;
}
int main()
{
    int a,b;
    while(scanf("%d",&n),n)
    {
        initt();
        while(scanf("%d",&a),a)
        {
            while(getchar()!='\n')
            {
                scanf("%d",&b);
                add(a,b);
                add(b,a);
            }
        }
        root=1;
        tarjan(1,-1);
        int ans = 0;
        FOR(i,1,n+1)
        {
            if(dian[i]!=0)
            {
                ans++;
               // gedian[ge++] = i;
            }
        }
        cout<<ans<<endl;
       // puts("割点是");
      /* printf("ge = %d\n",ge);
        FOR(i,0,ge)
        printf("%d ",gedian[i]);
        printf("\n");*/
    }
    return 0;
}
时间: 2024-10-26 16:11:20

POJ1144 Network(判断割点)的相关文章

Uva 315 Network 判断割点

模板题,注意输出 #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #include <vector> #include <stack> using namespace std; typedef long long LL; const int N = 1e2+5; int head[N],tot,n; struct Edge{ i

poj1144 tarjan求割点

poj1144 tarjan求割点 额,算法没什么好说的,只是这道题的读入非常恶心. 还有,理解tarjan一定要用递归树,配合横边回边前边树边等来想.. #include <cctype> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=100, maxm=5000; struct Graph{ struct Edge

【连通图|割点】POJ-1144 Network

Network Time Limit: 1000MS Memory Limit: 10000K 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 li

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

【POJ1144】Network(割点)(模板)

题意:给定一张无向图,求割点个数 思路:感谢CC大神http://ccenjoyyourlife.blog.163.com/的讲解 割点的定义就是某个联通块中删去此点连通性发生变化的的点 有两种割点:1.U为树根,子树个数>1 2.U非树根,有U的子节点V满足low[v]>=dfn[u]表示U的V子树必须通过U去到U的上面 更新时也有两种:dfn[u]<dfn[v]时u--->v 实边 反则u--->v 虚边 实边时low[u]=min(low[u],low[v]) 虚边lo

POJ1144 Network 题解 点双连通分量(求割点数量)

题目链接:http://poj.org/problem?id=1144 题目大意:给以一个无向图,求割点数量. 这道题目的输入和我们一般见到的不太一样. 它首先输入 \(N\)(\(\lt 100\))表示点的数量(\(N=0\)表示文件输入结束). 然后接下来每行输入一组数字. 如果这一组数字只包含一个 \(0\) ,说明本组测试数据输入结束: 否则,假设这些数可以拆分成 \(a_1,a_2,a_3, \cdots ,a_m\),则说明 \(a_1\) 这个点到 \(a_2,a_3, \cdo

poj1144 求不同割点的个数

Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11914   Accepted: 5519 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

poj1144 tarjan求割点 裸题

Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11684   Accepted: 5422 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

Android Network -------------------判断网络状态(网络的连接,改变,和判断2G/3G/4G)

现在app大多都需要从网络上获得数据.所以访问网络是在所难免.但是再访问网络之前,我们应该先做一下网络的状态判断.其实在访问网络之前我们要做一些状态判断,对应一些状态判断来做处理,并不是直接使用Http访问网络即可.很多人在开发就经常把网络这块直接跳过,直接访问网络,可以一断网,各种体验效果不好,不是说app没法用,只是体验效果差.还有,就是我们可能为用户考虑,因为现在一般连网是wifi和手机流量,都知道后者收费是比较高的.假如我们的app加载的图片或者有大的数据下载操作,可是用户的本意是要是在