SPF POJ - 1523 割点+并查集
题意:
问你这个图中哪个点是割点,如果把这个点去掉会有几个子网
代码:
1 //给你几个点,用着几个点形成了一个图。输入边形成的图,问你这个图中有多少个割点。每一个割点去掉后会形成几个强连通分量
2 //方法:
3 //你可以想用tarjan算法求出来谁是割点。然后每一个割点单独用并查集判断。用所有边(不和这个割点相连的边)通过并查集判断一下
4 //然合并后有几个区域就可以了
5 #include<stdio.h>
6 #include<string.h>
7 #include<algorithm>
8 using namespace std;
9 const int spot=1010;
10 const int edge=500010;
11 struct node
12 {
13 int u,v;
14 }m[edge];
15 struct stu
16 {
17 int to,next;
18 } a[edge];
19 int head[spot],fa,low[spot],num[spot],root,indexx,sizes,flag1,n,fx[spot],qua,len,v[spot]; //fx指祖节点
20 bool flag[spot],flag2[spot],b[spot],have[spot];
21 void init()
22 {
23 indexx=0,sizes=0,flag1=1,n=0;
24 len=qua=0;
25 memset(head,-1,sizeof(head));
26 memset(low,0,sizeof(low));
27 memset(num,0,sizeof(num));
28 memset(flag,0,sizeof(flag));
29 memset(have,0,sizeof(have));
30 }
31 void add_edge(int from,int to) //并查集
32 {
33 a[sizes].to=to;
34 a[sizes].next=head[from];
35 head[from]=sizes++;
36 a[sizes].to=from;
37 a[sizes].next=head[to];
38 head[to]=sizes++;
39 n=max(n,from);
40 n=max(n,to);
41 m[len].u=from;
42 m[len++].v=to;
43 }
44 void dfs(int cur) //求割点
45 {
46 int child=0;
47 num[cur]=++indexx;
48 low[cur]=indexx;
49 int k,v;
50 for(k=head[cur]; k+1; k=a[k].next)
51 {
52 v=a[k].to;
53 if(!num[v])
54 {
55 dfs(v);
56 low[cur]=min(low[cur],low[v]);
57 if(low[v]>=num[cur])
58 {
59 child++;
60 if(cur!=fa || child>1) flag[cur]=1,qua++;
61 }
62 }
63 else
64 low[cur]=min(low[cur],num[v]);
65 }
66 }
67 int finds(int x)
68 {
69 if(x!=v[x])
70 {
71 int y=finds(v[x]);
72 return v[x]=y;
73 }
74 return x;
75 }
76 int panduan(int x)
77 {
78 for(int i=1;i<=n;++i)
79 {
80 if(have[i]) v[i]=i;
81 }
82 for(int i=0;i<len;++i)
83 {
84 if(m[i].u!=x && m[i].v!=x)
85 {
86 int fx=finds(m[i].u);
87 int fy=finds(m[i].v);
88 if(fx!=fy) v[fx]=fy;
89 }
90 }
91 int ans=0;
92 for(int i=1;i<=n;++i)
93 {
94 if(i!=x && v[i]==i) ++ans;
95 }
96 return ans;
97 }
98 int main()
99 {
100 int x,y,i,ss=0,ans,j;
101 while(scanf("%d",&x)&&x)
102 {
103 init();
104 scanf("%d",&y);
105 root=x;
106 have[x]=1;
107 have[y]=1;
108 add_edge(x,y);
109 for(;;)
110 {
111 scanf("%d",&x);
112 if(!x) break;
113 scanf("%d",&y);
114 add_edge(x,y);
115 have[x]=1,have[y]=1;
116 }
117 fa=root;
118 dfs(root);
119 printf("Network #%d\n",++ss);
120 for(i=1; i<=n; i++)
121 {
122 if(flag[i])
123 {
124 flag1=0;
125 int q=panduan(i);
126 printf(" SPF node %d leaves %d subnets\n",i,q);
127 }
128 }
129 if(flag1)
130 printf(" No SPF nodes\n");
131 printf("\n");
132 }
133 return 0;
134 }
SPF POJ - 1523 割点+并查集的更多相关文章
- Electricity POJ - 2117 + SPF POJ - 1523 去除割点后求强连通分量个数问题
Electricity POJ - 2117 题目描述 Blackouts and Dark Nights (also known as ACM++) is a company that provid ...
- poj 2524 (并查集)
http://poj.org/problem?id=2524 题意:在一所学校里面的人,都有宗教信仰,不过他们的宗教信仰有可能相同有可能不同,但你又不能直接去问他们,但你可以问他们和谁是同一个宗教.通 ...
- [POJ 2588]--Snakes(并查集)
题目链接:http://poj.org/problem?id=2588 Snakes Time Limit: 1000MS Memory Limit: 65536K Description B ...
- poj 1456 Supermarket - 并查集 - 贪心
题目传送门 传送点I 传送点II 题目大意 有$n$个商品可以销售.每个商品销售会获得一个利润,但也有一个时间限制.每个商品需要1天的时间销售,一天也只能销售一件商品.问最大获利. 考虑将出售每个物品 ...
- poj 2492(关系并查集) 同性恋
题目;http://poj.org/problem?id=2492 卧槽很前卫的题意啊,感觉节操都碎了, t组测试数据,然后n,m,n条虫子,然后m行,每行两个数代表a和b有性行为(默认既然能这样就代 ...
- poj 1182 (关系并查集) 食物链
题目传送门:http://poj.org/problem?id=1182 这是一道关系型并查集的题,对于每个动物来说,只有三种情况:同类,吃与被吃: 所以可以用0,1,2三个数字代表三种情况,在使用并 ...
- Poj(1182),种类并查集
题目链接:http://poj.org/problem?id=1182 再次熟练种类并查集,又积累点经验,和技巧,rank 0 2 1 先计算father[x] ,再更新rank[x]; #inclu ...
- Poj(1703),种类并查集
题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...
- POJ 1182 食物链 [并查集 带权并查集 开拓思路]
传送门 P - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit ...
随机推荐
- 安装Tomcat 9
文章目录 访问Tomcat官网 选择下载所需的软件包 安装Tomcat 测试安装 访问Tomcat官网 Tomcat官方的下载地址为:https://tomcat.apache.org/downloa ...
- Azure App object和Service Principal
为了把Identity(身份)和Access Management function(访问管理功能)委派给Azure AD,必须向Azure AD tenant注册应用程序.使用Azure AD注册应 ...
- 【Linux】rsync的相关用途
Rsync,代表"remote sync",它是本地和远程主机文件同步工具.它只同步更改的文件,以此实现最小化传输数据. 我使用Ubuntu 16.04做为例子,但是你可以把它应用 ...
- 【ORACLE错误】SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled
执行set autotrace traceonly的时候,报错 SQL> set autotrace traceonly SP2-0618: Cannot find the Session Id ...
- 使用yaml来实现ingress-nginx
创建一个ingress-nginx [root@k8s-master ingress]# cat ingress-nginx.yaml apiVersion: v1 kind: Namespace m ...
- Netty学习:ChannelHandler执行顺序详解,附源码分析
近日学习Netty,在看书和实践的时候对于书上只言片语的那些话不是十分懂,导致尝试写例子的时候遭遇各种不顺,比如decoder和encoder还有HttpObjectAggregator的添加顺序,研 ...
- 前端知识(二)01-NPM包管理器-谷粒学院
目录 一.简介 二.使用npm管理项目 1.项目初始化 2.修改npm镜像 3.npm install命令的使用 4.其它命令 一.简介 什么是NPM NPM全称Node Package Manage ...
- Flask之静态文件处理
静态文件的处理 推荐 from flask import Flask,render_template app = Flask(__name__,template_folder='templates', ...
- Mybatis【15】-- Mybatis一对一多表关联查询
注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-11-one2one,需要自取,需要配置maven ...
- 手写Netty之多路复用Select小案例
注意:本文只是将上文多路复用器Select.Poll.Epoll区别梳理中提出的概念与Netty中的步骤联系起来,方便后面回顾,代码中注释很多,对于大家来说如果不是怀有同样的目的,不一定有用. 单线程 ...