• 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
    ", _nodes[i].Effect);
    	return 0;
    }
    

      

  • 相关阅读:
    小小的蜗牛有大大的梦想
    Spring整合的quartz任务调度的实现方式
    HDU/HDOJ 2612 Find a way 双向BFS
    在静态库中,实现自动的初始化与卸载接口
    CF 316C2(Tidying Up-二分图最大边权)
    Qt线程同步操作用QWaitCondition QMutex
    MQ、JMS以及ActiveMQ
    微博分享利器
    discuz清空session,导致session保存机制失败,session无法更新与解决
    路由器和交换机的综合实验(1)
  • 原文地址:https://www.cnblogs.com/headboy2002/p/9398845.html
Copyright © 2020-2023  润新知