原题来自:CEOI 1996

一个电话线公司(简称 TLC)正在建立一个新的电话线缆网络,他们连接了若干个地点,编号分别从 1 到 N,没有两个地点有相同的号码,这些线是双向的并且能使两个地点保持通讯,每个地点的线都终结于电话交换机。每个地点都有一个电话交换机。从每个地点都能通过线缆到达其他任意的地点,然而它并不需要直接连接,它可以通过若干个交换机来到达目的地。

有时候某个地点供电出问题时,交换机就会停止工作。TLC 的工作人员意识到,除非这个地点是不可达的,否则这种情况就会发生,它还会导致一些其它的地点不能互相通讯。在这种情况下我们会称这个地点(错误发生的地方)为灾区。现在工作人员想要写一个程序统计所有灾区的数量。帮帮他们。

输入格式

输入文件包括若干组测试数据。

每一组是一个网络,每一组测试数据的第一行是地点的总数量 N。每组接下来最多有 N 行包括一个数字表示一个地点和与它相连接的地点的数字。最多 N 行可以完全描述整个网络,比如,网络中每个直接连接的两个地点被至少一行包括。一行内的所有数字都要用空格隔开。每组数据需要用单独的一个 0 结束。最后的块只有一行即 N=0。

输出格式

输出除了最后一组,其他每一组的灾区的数量,每个块用一行输出。

样例

样例输入

5
5 1 2 3 4
0
6
2 1 3
5 4 6 2
0
0

样例输出

1
2

数据范围与提示

 N<100
 ___________________________________________________________
 
求割点的模板题目。

___________________________________________________________

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=105;
4 int n;
5 struct edge
6 {
7 int u,v,nxt;
8 }e[maxn*maxn];
9 int head[maxn],js;
10 void addage(int u,int v)
11 {
12 e[++js].u=u;e[js].v=v;
13 e[js].nxt=head[u];head[u]=js;
14 }
15 int low[maxn],dfn[maxn],cnt,st[maxn],top,lts;
16 bool cut[maxn];
17 vector<int>lt[maxn];
18 void tarjan(int u,int rt)
19 {
20 low[u]=dfn[u]=++cnt;
21 st[++top]=u;
22 int ct=0;
23 for(int i=head[u];i;i=e[i].nxt)
24 {
25 int v=e[i].v;
26 if(!dfn[v])
27 {
28 ct++;
29 tarjan(v,rt);
30 low[u]=min(low[u],low[v]);
31 if((ct>1 && u==rt)||(u!=rt && low[v]>=dfn[u]))cut[u]=1;
32 /*
33 if(low[v]>=dfn[u])
34 {
35 lts++;
36 lt[lts].clear();
37 while(st[top]!=u)lt[lts].push_back(st[top--]);
38 lt[lts].push_back(u);
39 }
40 */
41 }
42 else low[u]=min(low[u],dfn[v]);
43 }
44 }
45 void init()
46 {
47 memset(head,0,sizeof head);
48 js=0;
49 memset(low,0,sizeof low);
50 memset(dfn,0,sizeof dfn);
51 cnt=0;
52 top=0;
53 lts=0;
54 memset(cut,0,sizeof cut);
55
56 }
57 int main()
58 {
59 while(scanf("%d",&n),n)
60 {
61 init();
62 int u,v;
63 while(scanf("%d",&u),u)
64 {
65 while(1)
66 {
67 scanf("%d",&v);
68 addage(u,v);addage(v,u);
69 char c=getchar();
70 if(c=='\n')break;
71 }
72 }
73 for(int i=1;i<=n;++i)
74 if(!dfn[i])tarjan(i,i);
75 int jss=0;
76 for(int i=1;i<=n;++i)if(cut[i])jss++;
77 printf("%d\n",jss);
78 }
79 return 0;
80 }

LOJ10100的更多相关文章

  1. LOJ-10100(割点个数)

    题目链接:传送门 思路: 就是求割点的个数,直接Tarjan算法就行. 注意输入格式(判断比较水). #include<iostream> #include<cstdio> # ...

  2. loj10100 网络

    这个题目描述好难理解呀qwq... 传送门 分析 在读懂题之后我们不难发现这道题实际就是在求一张图中有多少个割点.只需要注意读入方式即可. 代码 #include<iostream> #i ...

随机推荐

  1. CAP理论和BASE理论及数据库的ACID中关于一致性及不同点的思考

    CAP定理又被称作是布鲁尔定理,是加州大学伯克利分销计算机科学家里克在2000年提出,是分布式理论基础. CAP:是分布式系统的理论基础 [一致性  可用性   分区容错性] BASE理论是对CAP中 ...

  2. 表单绑定v-model

    表单控件在实际开发中是极为常见的.特别是对于用户信息的提交,需要大量的表单.Vue中使用v-model指令来实现表单元素和数据的双向绑定.此篇记录下其原理,以及当时学习时候的一些小尝试以及修饰符. v ...

  3. vue的绑定属性v-bind

    v-bind的简略介绍 v-bind用于绑定一个或多个属性值,或者向另一个组件传递props值.目前,个人所用之中,更多的是使用于图片的链接src,a标签中的链接href,还有样式以及类的一些绑定,以 ...

  4. 元旦在家撸了两天Seata源码,你们是咋度过的呢?

    撸Seata源码 2020年12月31日晚23点30分,我发了2020年的最后一个朋友圈:假期吃透Seata源码,有组队的吗? 不少小伙伴都来点赞了, 其中也包括Seata项目的发起人--季敏大佬哦! ...

  5. window10搭建pyspark(超级详细)

    一.组件版本说明 Java JDK:1.8.0_144 spark-2.4.3-bin-hadoop2.7hadoop-2.7.7 scala-2.12.8 hadooponwindows-maste ...

  6. day121:MoFang:植物的状态改动(幼苗→成长期)&植物的浇水功能

    目录 1.当果树种植以后在celery的异步任务中调整浇水的状态 2.客户端通过倒计时判断时间,显示浇水道具 3.客户端判断当前种植物状态控制图标的显示和隐藏 4.当用户单击浇水图标, 则根据当前果树 ...

  7. PHPstorm 配置主题

    1.首先先去下载自己喜欢的主题:http://www.phpstorm-themes.com/ 但是在下载的时候会发现一个问题,在点击下载后,并没有下载,而是会打开这个文件(不同的浏览器不同)但是如果 ...

  8. 基于腾讯云存储COS的ClickHouse数据冷热分层方案

    一.ClickHouse简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),支持PB级数据量的交互式分析,ClickHouse最初是为YandexMetrica ...

  9. 常用 .gitignore 模板

    前言 每次建项目的时候可以直接复制了,也算是方便自己,以后发现少的会更新 正文 作用 git提交时忽略文件 文件名 .gitignore Python # Byte-compiled / optimi ...

  10. Vue.nextTick()的使用

    什么是Vue.nextTick()?? 定义:在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 所以就衍生出了这个获取更新后的DOM的Vue方法.所 ...