luogu3469 [POI2008]BLO_Blockade
题目大意
给一个无向连通图,求对于每一个点,去掉该点后图中连通结点有序对的减少量。
思路
当时想这道题时,我想到:枚举每一个点,在删去它后连通的几个部分中Dfs得到各个部分的点的个数从而得到解,但是我忘了:割点的定义便是删去该点后,图能被分成多个连通部分的点!所以我们用Tarjan算法Dfs得到割点,同时得到被割点分成的各个大部分的结点总数(包括Dfs后的部分 和 正在及即将要Dfs的部分)即可得到答案。其它不是割点的结点的影响都是(n-1)*2。
注意事项
- 特殊判定根节点!
- 仍然记住一个点是割点不代表与割点相连的结点都属于不同的边双连通分量。所以求“正在及即将要Dfs的部分”内的结点总数时,参与运算的“Dfs后的部分”内的结点总数必须是 部分的头的low>=cur->DfsN的部分内的结点总数,而不是所有Dfs过到的结点的总数。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; #define ll long long
const int MAX_NODE = 100010; struct Node
{
vector<Node*> Next;
bool IsCut;
int DfsN, Low;
ll Effect;
}_nodes[MAX_NODE];
int DfsCnt, _vCount; int Dfs(Node *cur)
{
cur->DfsN = cur->Low = ++DfsCnt;
int subSizeSum = 0, cutSubSizeSum = 0, cnt = 0, tempRootCutSize = 0;
ll cutEffect = 0;
for (unsigned int i = 0; i < cur->Next.size(); i++)
{
if (!cur->Next[i]->DfsN)
{
cnt++;
int subSize = Dfs(cur->Next[i]);
subSizeSum += subSize;
cur->Low = min(cur->Low, cur->Next[i]->Low);
if (cur->DfsN <= cur->Next[i]->Low)
{
if (cur != _nodes + 1 || cnt > 1)
cur->IsCut = true;
cutEffect += (ll)subSize * (ll)(_vCount - subSize - 1);
cutSubSizeSum += subSize;
}
}
else
cur->Low = min(cur->Low, cur->Next[i]->DfsN);
}
cutEffect += (ll)(_vCount - cutSubSizeSum - 1) * (ll)cutSubSizeSum;
cur->Effect = (_vCount - 1) * 2;
if (cur->IsCut)
cur->Effect += cutEffect;
return subSizeSum + 1;
} int main()
{
int totEdge;
scanf("%d%d", &_vCount, &totEdge);
for (int i = 1; i <= totEdge; i++)
{
int u, v;
scanf("%d%d", &u, &v);
_nodes[u].Next.push_back(_nodes + v);
_nodes[v].Next.push_back(_nodes + u);
}
Dfs(_nodes + 1);
for (int i = 1; i <= _vCount; i++)
printf("%lld\n", _nodes[i].Effect);
return 0;
}
luogu3469 [POI2008]BLO_Blockade的更多相关文章
- luogu3469 [POI2008]BLO-Blockade
#include <iostream> #include <cstring> #include <cstdio> using namespace std; type ...
- [BZOJ1112][POI2008]砖块Klo
[BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...
- [bzoj1122][POI2008]账本BBB
1122: [POI2008]账本BBB Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 402 Solved: 202[Submit][Status ...
- BZOJ 1113: [Poi2008]海报PLA
1113: [Poi2008]海报PLA Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1025 Solved: 679[Submit][Statu ...
- BZOJ 1116: [POI2008]CLO
1116: [POI2008]CLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 922 Solved: 514[Submit][Status][ ...
- BZOJ 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1736 Solved: 606[Submit][Statu ...
- BZOJ 1124: [POI2008]枪战Maf
1124: [POI2008]枪战Maf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 617 Solved: 236[Submit][Status ...
- BZOJ 1123: [POI2008]BLO
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1030 Solved: 440[Submit][Status] ...
- BZOJ 1121: [POI2008]激光发射器SZK
1121: [POI2008]激光发射器SZK Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 792 Solved: 653[Submit][Sta ...
随机推荐
- java学习笔记_网络
客户端 import java.io.*; import java.net.*; public class DailyAdviceClient { public void go() { try { S ...
- 浅谈Java中的hashcode方法以及equals方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...
- P3368 【模板】树状数组 2(树状数组维护差分序列)
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- [转]【C/C++】Linux下使用system()函数一定要谨慎
曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值.它所执行命令的返回值以及命令执行失败原 ...
- 基于TensorFlow的车牌号识别系统
简介 过去几周我一直在涉足深度学习领域,尤其是卷积神经网络模型.最近,谷歌围绕街景多位数字识别技术发布了一篇不错的paper.该文章描述了一个用于提取街景门牌号的单个端到端神经网络系统.然后,作者阐述 ...
- html5——动画
基本介绍 /*执行函数gun,执行时间,重复执行,反向执行,匀速执行,延迟执行时间*/ animation: gun 4s infinite alternate linear 5s; 动画序列 1.g ...
- JS——拖拽盒子
注意事项: 1.opacity是全部元素变透明,rgba只是背景色变透明 2.先是注册鼠标按下的事件,此时就需要记录鼠标在盒子中的坐标 3.再在鼠标按下事件中注册鼠标移动事件,此时鼠标的坐标是不断变化 ...
- Lazarus 1.6 增加了新的窗体编辑器——Sparta_DockedFormEditor.ipk
一下是该控件官网的介绍 "Hello A package for a docked form editor can be found in : components/sparta/docke ...
- thinkphp里模版文件js无法使用if condition的问题
/** * @example thinkphp里模版文件js无法使用if condition的问题 * @example 参考地址:https://segmentfault.co ...
- Java报表统计导出Word-xdocin方式
官网:http://www.xdocin.com Controller层: //创建对象 XDocService xdocService = new XDocService(); //封装参数 Map ...