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编程的逻辑》第一部分 编程基础与二进制
- c#——值类型与引用类型
值类型传的是值 引用类型传的是地址
- ASP.NET MVC 二维码生成(ThoughtWorks.QRCode)
原文地址http://www.cnblogs.com/jys509/p/4592539.html
- 认识 java JVM虚拟机选项 Xms Xmx PermSize MaxPermSize 区别
点击window---->preferences---->配置的tomcat---->JDK,在Optional Java VM arguments:中输入 -Xmx512M -Xm ...
- illumina测序原理
一些常用基本概念的介绍: flowcell流动池 是指Illumina测序时,测序反应发生的位置,1个flowcell含有8条lane lane通道 每一个flowcell上都有8条泳道,用于测序反应 ...
- 初学者怎么快速掌握Linux运维?
2018年里,Linux运维的职位数量和平均薪资水平仍然持续了去年的强劲增幅,比很多开发岗位涨的都快.从研究机构的数据来看,Linux职位数量和工资水平涨幅均在IT行业的前五之列,比去年的表现还要好一 ...
- 输出n*n矩阵
int matrix[MAX][MAX]; void PrintMatrix(int x,int y,int start,int n) { ) return ; ) { matrix[x][y] = ...
- POJ 2823 Sliding Window & Luogu P1886 滑动窗口
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 66613 Accepted: 18914 ...
- (蓝桥)2017C/C++A组第七题正则问题
#include<iostream> #include<memory.h> #include<stack> #include<string> using ...
- MongoDB - 认识MongoDB及数据类型
目录 MongoDB - 认识MongoDB及数据类型 启动 MogoDB的数据 MogoDB的数据类型 1.Object ID : Documents自生成的_id 2.string : 字符串,必 ...