求割点 poj 1523

给你一些双向边 求有多少个割点 并输出去掉点这个点 去掉后有几个联通分量

Tarjan

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<queue>
 5 #include<math.h>
 6
 7 using namespace std;
 8
 9 #define MAXN 1000
10 int head[MAXN+10],dfn[MAXN+10],low[MAXN+10],z[MAXN+10];
11 int cnt,num;
12
13 struct edg
14 {
15     int to,next;
16
17 }x[1000000];
18
19 void add(int u,int v)
20 {
21     x[cnt].next=head[u];
22     x[cnt].to=v;
23     head[u]=cnt++;
24 }
25 void dfs(int u,int k)
26 {
27     int i;
28     dfn[u]=low[u]=k;
29     for(i=head[u];i!=-1;i=x[i].next)
30     {
31         if(!dfn[x[i].to]) //没访问过 x[i].to孩子节点
32         {
33             dfs(x[i].to,k+1);
34             low[u]=min(low[u],low[x[i].to]);
35             if(low[x[i].to]>=dfn[u]) //不能跳过这个点 去掉后 必然多一个
36                 z[u]++;
37         }
38         else
39             low[u]=min(low[u],dfn[x[i].to]); //访问过 x[i].to 是父亲节点
40     }
41 }
42 int main()
43 {
44     int n,m,ca,m1;
45     ca=1;
46
47     while(scanf("%d",&n)!=EOF&&n)
48     {
49         m1=0;
50         memset(head,-1,sizeof(head));
51         memset(z,0,sizeof(z));
52         memset(dfn,0,sizeof(dfn));
53         memset(low,0,sizeof(low));
54         scanf("%d",&m);
55         m1=max(n,m);
56         add(n,m),add(m,n);
57
58         int a,b;
59         while(scanf("%d",&a)!=EOF&&a)
60         {
61             scanf("%d",&b);
62             m1=max(m1,a);
63             m1=max(m1,b);
64             add(a,b),add(b,a);
65         }
66         dfs(1,1); /考虑 1 是根 数组搞出来要减1
67         z[1]--;
68         if(ca!=1)
69             printf("\n");
70         printf("Network #%d\n",ca++);
71         int ok=0;
72
73         for(int i=1;i<=m1;i++)
74         {
75             if(z[i]>0)
76             {
77                 printf("  SPF node %d leaves %d subnets\n",i,z[i]+1); 去掉该点以下的联通分量 上面还有一半
78                 ok=1;
79             }
80         }
81         if(ok==0)
82             printf("  No SPF nodes\n");
83     }
84
85     return 0;
86 }
87 /*
88 Network #1
89   SPF node 3 leaves 2 subnets
90 */
时间: 2024-10-01 00:31:51

求割点 poj 1523的相关文章

POJ 1523 SPF(强连通分量求割点)

题目地址:POJ 1523 这题猛的一看..貌似有点难的样子.不过仔细一想,那个每个割点所分成一次子图不就都能找到这个割点一次吗,那么只要记录下它作为割点的次数再+1不就行了.也算是求割点的裸题吧.这个题的输出很坑...需要注意一下.. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #incl

POJ 1523 SPF 求割点的好(板子)题!

题意: 给个无向图,问有多少个割点,对于每个割点求删除这个点之后会产生多少新的点双联通分量 题还是很果的 怎么求割点请参考tarjan无向图 关于能产生几个新的双联通分量,对于每个节点u来说,我们判断他是否是割点,即判断是否满足他的儿子v的low[v]>dfn[u] 而这个时候割掉这个点就会让双联通分量增加,所以搞一个数组记录一下这个操作的次数就行 请注意在是否是根节点的问题上特判 !!注意输出格式!! 1 #include<cstdio> 2 #include<algorithm

SPF(poj 1523) 割点入门

1 /***************************************** 2 SPF(poj 1523) 3 割点入门 4 http://poj.org/problem?id=1523 5 6 ******************************************/ 7 8 #include<iostream> 9 #include<algorithm> 10 #include<cstdio> 11 #include<cstring&

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 <

Poj 1144 Zoj 1311 求割点 模板

写这个就是为了手写一份好用的求割点模板: 吐槽下,题目中的 Each of the next at most N lines contains the number of a place followed by the numbers of some places to which there is a direct line from this place.  这个at most是不可信的,应该是用大于n行的测试数据,因为这个我WA了... #include <cstdio> #includ

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

poj 1144 (Tarjan求割点数量)

题目链接:http://poj.org/problem?id=1144 描述 一个电话线公司(简称TLC)正在建立一个新的电话线缆网络.他们连接了若干个地点分别从1到N编号.没有两个地点有相同的号码.这些线是双向的并且能使两个地点保持通讯.每个地点的线都终结于电话交换机.每个地点都有一个电话交换机.从每个地点都能通过线缆到达其他任意的地点,然而它并不需要直接连接,它可以通过若干个交换机来到达目的地.有时候某个地点供电出问题时,交换机就会停止工作.TLC的工作人员意识到,除非这个地点是不可达的,否

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