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 ...
随机推荐
- /usr/local/mysql/bin/mysqlbinlog -vv /var/lib/bin/mysql-bin.000008 --base64-output=DECODE-ROWS --start-pos=307
/usr/local/mysql/bin/mysqlbinlog -vv /var/lib/bin/mysql-bin.000008 --base64-output=DECODE-ROWS --st ...
- vmstat参数详解
vmstat 5 可以使用ctrl+c停止vmstat,可以看到输出依赖于所用的操作系统,因此可能需要阅读一下手册来解读报告 第一行的值是显示子系统启动以来的平均值,第二行开始展示现在正在发生的情况, ...
- Objects as Points:预测目标中心,无需NMS等后处理操作 | CVPR 2019
论文基于关键点预测网络提出CenterNet算法,将检测目标视为关键点,先找到目标的中心点,然后回归其尺寸.对比上一篇同名的CenterNet算法,本文的算法更简洁且性能足够强大,不需要NMS等后处理 ...
- oracle字符集与乱码(转)
作者:hcling97 http://blog.sina.com.cn/hcling97 2013年5月15日 转载请注明出处 字符集问题一直叫人头疼,究其原因还是不能完全明白其运作原理. 在整 ...
- 如何在 Blazor WebAssembly中 使用 功能开关
微软Azure 团队开发的 功能管理 (Feature Management) 包 Microsoft.FeatureManagement可用于实现 功能开关,可以通过 功能开关 特性动态的改变应用程 ...
- uni-app开发经验分享十七: 开发微信公众号(H5)JSSDK 的使用方式
因为这个jssdk被uni-app坑了好多天,作者说支持1.4版本,但是我用1.4的两个分享的新方法一直不支持. 最后只能放弃了,期待什么时候能更新上. 基本的使用方法:第一步 - 下载使用方式下载地 ...
- NFS存储迁移至GlusterFS
NFS存储迁移至GlusterFS 前提条件 为防止脑裂,建议使用最低3台节点制作3复制集的存储卷: 在进行存储迁移前,GluseterFS存储节点需先成为k8s集群中的node节点: 存储切换时请勿 ...
- Trie 前缀树或字典树 确定有限状态自动机
https://zh.wikipedia.org/wiki/Trie 应用 trie树常用于搜索提示.如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能.[ ...
- 为什么Redis集群要使用反向代理?
为什么要使用反向代理? 如果没有方向代理,一台Redis可能需要跟很多个客户端连接: 看着是不是很慌?看没关系,主要是连接需要消耗线程资源,没有代理的话,Redis要将很大一部分的资源用在与客户端建立 ...
- ACCESS数据库偏移注入
偏移注入主要是针对知道表,但是不知道字段的ACCESS数据库. 比如我们已经知道了表名是 admin 判断字段数: http://192.168.74.136:8002/Production/PROD ...