热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CodeForces744AHongcowBuildsANation(并查集+容斥)

题意:给出一个无向图,有N个点,M个边和K个根节点。问在保证根节点间无通路时,最多加多少条边。思路:利用并查

题意:

        给出一个无向图,有N个点,M个边和K个根节点。问在保证根节点间无通路时,最多加多少条边。

思路:

        利用并查集计算出每个根对应的集合中点的个数后,显然我们有三种点集:

                1.点数最多的有根点集

                2.其他有根点集

                3.无根点集

        满足以上条件加边后的状态为

                1.点数最多的有根点集构成完全图

                2.其他有根点集构成完全图

        就剩无根点集了,显然无根点集也要构成完全图,而且要与且仅能与一个有根点集相连

        那么要想得到最多的边,就要把无根点集与点数最多的有根点集相连

        利用一点容斥的思想可以得到    要加边数 = 所有点集完全图的边数 + 无根点集的点数 * 点数最多的有根点集的点数 - 现有的边数 M

        或者我们可以把无根点集直接加入点数最多的有根点集,那么 要加边数 = 所有点集完全图的边数 - 现有的边数 M

代码:

#include using namespace std;
const int MAXN=1010;
int num[MAXN],F[MAXN];
int find(int t)
{if(F[t]==t) return t;return F[t]=find(F[t]);
}
void bing(int a,int b)
{int t1=find(a);int t2=find(b);if(t1!=t2) F[t1]=t2;
}
int main()
{int n,m,k,t1,t2;int cap[MAXN];while(cin>>n>>m>>k){memset(num,0,sizeof(num));for(int i&#61;1;i<&#61;n;i&#43;&#43;)F[i]&#61;i;for(int i&#61;1;i<&#61;k;i&#43;&#43;)scanf("%d",&cap[i]);for(int i&#61;1;i<&#61;m;i&#43;&#43;){scanf("%d%d",&t1,&t2);bing(t1,t2);}for(int i&#61;1;i<&#61;n;i&#43;&#43;)num[find(i)]&#43;&#43;;int maxn&#61;0,lef&#61;n;int ans&#61;0;for(int i&#61;1;i<&#61;k;i&#43;&#43;){num[cap[i]]&#61;num[find(cap[i])];maxn&#61;max(maxn,num[cap[i]]);lef-&#61;num[cap[i]];ans&#43;&#61;(num[cap[i]]-1)*(num[cap[i]])/2;}ans&#43;&#61;(lef&#43;maxn)*(lef&#43;maxn-1)/2;ans-&#61;maxn*(maxn-1)/2&#43;m;cout<}






Hongcow is ruler of the world. As ruler of the world, he wants to make it easier for people to travel by road within their own countries.

The world can be modeled as an undirected graph with n nodes and m edges. k of the nodes are home to the governments of the k countries that make up the world.

There is at most one edge connecting any two nodes and no edge connects a node to itself. Furthermore, for any two nodes corresponding to governments, there is no path between those two nodes. Any graph that satisfies all of these conditions isstable.

Hongcow wants to add as many edges as possible to the graph while keeping it stable. Determine the maximum number of edges Hongcow can add.

Input

The first line of input will contain three integers nm and k (1 ≤ n ≤ 1 0000 ≤ m ≤ 100 0001 ≤ k ≤ n) — the number of vertices and edges in the graph, and the number of vertices that are homes of the government.

The next line of input will contain k integers c1, c2, ..., ck (1 ≤ ci ≤ n). These integers will be pairwise distinct and denote the nodes that are home to the governments in this world.

The following m lines of input will contain two integers ui and vi (1 ≤ ui, vi ≤ n). This denotes an undirected edge between nodes ui and vi.

It is guaranteed that the graph described by the input is stable.


Output

Output a single integer, the maximum number of edges Hongcow can add to the graph while keeping it stable.


Example
Input

4 1 2
1 3
1 2

Output

2

Input

3 3 1
2
1 2
1 3
2 3

Output

0


Note

For the first sample test, the graph looks like this:

Vertices 1 and 3 are special. The optimal solution is to connect vertex 4 to vertices 1 and 2. This adds a total of 2 edges. We cannot add any more edges, since vertices 1 and 3 cannot have any path between them.

For the second sample test, the graph looks like this:

We cannot add any more edges to this graph. Note that we are not allowed to add self-loops, and the graph must be simple.



推荐阅读
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本问题涉及在给定的无向图中寻找一个至少包含三个节点的环,该环上的节点不重复,并且环上所有边的长度之和最小。目标是找到并输出这个最小环的具体方案。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ... [详细]
  • 在Qt框架中,信号与槽机制是一种独特的组件间通信方式。本文探讨了这一机制相较于传统的C风格回调函数所具有的优势,并分析了其潜在的不足之处。 ... [详细]
  • 使用QT构建基础串口辅助工具
    本文详细介绍了如何利用QT框架创建一个简易的串口助手应用程序,包括项目的建立、界面设计与编程实现、运行测试以及最终的应用程序打包。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 高级缩放示例.就像谷歌地图一样.它仅缩放图块,但不缩放整个图像.因此,缩放的瓷砖占据了恒定的记忆,并且不会为大型缩放图像调整大小的图像.对于简化的缩放示例lookhere.在Win ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • linux网络子系统分析(二)—— 协议栈分层框架的建立
    目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
  • 本文详细介绍了如何在循环双链表的指定位置插入新元素的方法,包括必要的步骤和代码示例。 ... [详细]
  • 本文探讨了 Java 中 net.minecraft.client.multiplayer.PlayerControllerMP 类下的 getCurrentGameType() 方法的详细使用方法,并提供了多个实际应用的代码示例。 ... [详细]
  • 如何高效解决Android应用ANR问题?
    本文介绍了ANR(应用程序无响应)的基本概念、常见原因及其解决方案,并提供了实用的工具和技巧帮助开发者快速定位和解决ANR问题,提高应用的用户体验。 ... [详细]
  • 在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ... [详细]
  • 使用C#构建动态图形界面时钟
    本篇文章将详细介绍如何利用C#语言开发一个具有动态显示功能的图形界面时钟。文章中不仅提供了详细的代码示例,还对可能出现的问题进行了深入分析,并给出了解决方案。 ... [详细]
author-avatar
白日做梦家_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有