bzoj1123 BLO tarjan求点双连通分量

填坑……链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1123

题意:问切断第i个点之后多少对点不再联通。

就是个求割点同时计算出双连通分量大小嘛……

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=100005,maxm=500005;
 7 struct node
 8 {
 9     int from,to,next;
10 }edge[maxm<<1];
11 int head[maxn],tot;
12 void addedge(int u,int v)
13 {
14     edge[++tot]=(node){u,v,head[u]};head[u]=tot;
15 }
16 int low[maxn],dfn[maxn],belong[maxn],cnt,bcnt,size[maxn],n,m;
17 bool iscut[maxn];
18 long long sum[maxn];
19 #include<vector>
20 #include<stack>
21 stack<node>s;vector<int>bcc[maxn];
22 void dfs(int root,int pa)
23 {
24     low[root]=dfn[root]=++cnt;
25     int son=0;size[root]=1;long long su=0;
26     for(int i=head[root];i;i=edge[i].next)
27     {
28         int v=edge[i].to;
29         if(!dfn[v])
30         {
31             s.push(edge[i]);son++;
32             dfs(v,root);low[root]=min(low[root],low[v]);
33             size[root]+=size[v];
34             if(low[v]>=dfn[root])
35             {
36                 sum[root]+=su*size[v];su+=1ll*size[v];
37                 iscut[root]=1;bcnt++;bcc[bcnt].clear();
38                 node x;int u=-1,va=-1;
39                 do
40                 {
41                     x=s.top();s.pop();
42                     u=edge[i].from,va=edge[i].to;
43                     if(belong[u]!=bcnt)bcc[bcnt].push_back(u),belong[u]=bcnt;
44                     if(belong[va]!=bcnt)bcc[bcnt].push_back(va),belong[va]=bcnt;
45                 }while(u!=root&&va!=v);
46             }
47         }
48         else if(dfn[v]<dfn[root]&&v!=pa)
49         {
50             s.push(edge[i]);
51             low[root]=min(low[root],dfn[v]);
52         }
53     }
54     if(pa<0&&son==1)iscut[root]=0;
55     sum[root]+=su*(n-su-1);
56 }
57 int haha()
58 {
59     scanf("%d%d",&n,&m);
60     for(int i=1;i<=m;i++)
61     {
62         int x,y;scanf("%d%d",&x,&y);
63         addedge(x,y);addedge(y,x);
64     }
65     for(int i=1;i<=n;i++)
66         if(!dfn[i])dfs(i,-1);
67     for(int i=1;i<=n;i++)printf("%lld\n",1ll*(sum[i]+n-1)*2);
68 }
69 int sb=haha();
70 int main(){;}

bzoj1123

时间: 2024-10-09 16:58:00

bzoj1123 BLO tarjan求点双连通分量的相关文章

【POJ3352】Road Construction tarjan求边-双连通分量,裸题模板题

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42671851 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 裸题只给模板. tarjan可以实现. 太水不发题解. 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 1010 #define M 202

Tarjan求点双连通分量

概述 在一个无向图中,若任意两点间至少存在两条"点不重复"的路径,则说这个图是点双连通的(简称双连通,biconnected) 在一个无向图中,点双连通的极大子图称为点双连通分量(简称双连通分量,Biconnected Component,BCC) 性质 任意两点间至少存在两条点不重复的路径等价于图中删去任意一个点都不会改变图的连通性,即BCC中无割点 若BCC间有公共点,则公共点为原图的割点 无向连通图中割点一定属于至少两个BCC,非割点只属于一个BCC 算法 在Tarjan过程中维

【POJ1523】SPF tarjan求点-双连通分量 裸题模板题

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42671865 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意:求哪些点是割点,割掉以后能把图分成几块. 太水不欲发题解. tarjan就好,不懂看代码. 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define

poj 3352 求 边-双连通分量

[题意] 给出一张无向连通图,求至少连几条边可以变成边双连通图 [思路]求出边-双连通分量,缩点就成了一棵树,求这棵树里的出度为1 的点num  结果是(num-1)/2; 1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<stack> 5 #include<vector> 6 using namespace std; 7 int pre[1002],

tarjan算法求桥双连通分量 POJ 3177 Redundant Paths

POJ 3177 Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12598   Accepted: 5330 Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) to another field, Bessie and the re

【BZOJ3331】[BeiJing2013]压力 Tarjan求点双

[BZOJ3331][BeiJing2013]压力 Description 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量.他们每天都生活在巨大的压力之下. 小强建立了一个模型.这世界上有N个网络设备,他们之间有M个双向的链接.这个世界是连通的.在一段时间里,有Q个数据包要从一个网络设备发送到另一个网络设备. 一个网络设备承受的压力有多大呢?很显然,这取决于Q个数据包各自走的路径.不过,某些数据包无论走什么路径都不可避免的要通过

图论算法-Tarjan模板 【缩点;割顶;双连通分量】

图论算法-Tarjan模板 [缩点:割顶:双连通分量] 为小伙伴们总结的Tarjan三大算法 Tarjan缩点(求强连通分量) int n; int low[100010],dfn[100010]; bool ins[100010]; int col[100010];//记录每个点所属强连通分量(即染色) vector<int> map[100010]; stack<int> st; int tot;//时间戳 int colnum;//记录强连通分量个数 void tarjan(

POJ 3352 Road Construction(边双连通分量,桥,tarjan)

题解转自http://blog.csdn.net/lyy289065406/article/details/6762370   文中部分思路或定义模糊,重写的红色部分为修改过的. 大致题意: 某个企业想把一个热带天堂岛变成旅游胜地,岛上有N个旅游景点,保证任意2个旅游景点之间有路径连通的(可间接连通).而为了给游客提供更方便的服务,该企业要求道路部门在某些道路增加一些设施. 道路部门每次只会选择一条道路施工,在该条道路施工完毕前,其他道路依然可以通行.然而有道路部门正在施工的道路,在施工完毕前是

fzu2181(点的双连通分量+求奇环)

求出每个点双连通分量,如果在一个点双连通分量中有奇环,则这个分量每个点都在一个奇环中.  关键是要知道怎么求点双连通分量以及点双连通的性质. fzu2181 http://acm.fzu.edu.cn/problem.php?pid=2181 #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define