C. Hongcow Builds A Nation
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

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 is stable.

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 n, m and k (1 ≤ n ≤ 1 000, 0 ≤ m ≤ 100 000, 1 ≤ 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.

Examples
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.

题意:给你n个点,然后m条边,和k个特殊的点,问最多再能连多少条边,要求k个点是两两不联通的;
思路:并查集:
找出联通块,然后将没有那些特殊点的先合并再一块-->t,sum为答案,sum+=cnt[t]*(cnt[t]-1)/2-原来有的边,然后再在特殊的点中找含点最多的和他和并统计答案,并且加上其他特殊联通块最多能加的边。
  1 #include<iostream>
2 #include<string.h>
3 #include<algorithm>
4 #include<queue>
5 #include<math.h>
6 #include<stdlib.h>
7 #include<stack>
8 #include<stdio.h>
9 #include<ctype.h>
10 #include<map>
11 #include<vector>
12 using namespace std;
13 typedef long long LL;
14 int c[100005];
15 int bin[100005];
16 int du[100005];
17 vector<int>vec[100005];
18 int fin(int x);
19 int ask[100005];
20 int id[100005];
21 map<int,int>my;
22 LL bian[100005];
23 int main(void)
24 {
25 int n,m,k;
26 int i,j;
27
28 while(scanf("%d %d %d",&n,&m,&k)!=EOF)
29 {
30 my.clear();
31 memset(bian,0,sizeof(bian));
32 for(i = 0; i <100005; i++)vec[i].clear(),bin[i] = i,du[i] = 1;
33 for(i = 1; i <=k; i++)
34 scanf("%d",&c[i]);
35 while(m--)
36 {
37 int x,y;
38 scanf("%d %d",&x,&y);
39 vec[x].push_back(y);
40 vec[y].push_back(x);
41 int xx = fin(x);
42 int yy = fin(y);
43 if(xx!=yy)
44 {
45 if(du[xx] > du[yy])
46 {
47 du[xx] += du[yy],bin[yy] = xx;
48 bian[xx]+=bian[yy];
49 bian[xx]++;
50 }
51 else
52 {
53 du[yy] += du[xx],bin[xx] = yy;
54 bian[yy]+=bian[xx];
55 bian[yy]++;
56 }
57 }
58 else bian[xx]++;
59 }
60 for(i = 1; i <= n; i++)
61 {
62 ask[i] = fin(i);
63 }
64 LL maxx = 0;
65 LL b;
66 for(i = 1; i <= k; i++)
67 {
68 my[ask[c[i]]] = 1;
69 if(du[ask[c[i]]]>maxx)
70 {
71 maxx = max((LL)du[ask[c[i]]],maxx);
72 b = bian[ask[c[i]]];
73 }
74 }
75 LL cnt = 0;
76 LL mc = 0;
77 for(i = 1; i <= n; i++)
78 {
79 if(!my.count(ask[i]))
80 {
81 cnt+=du[ask[i]];
82 my[ask[i]] = 1;
83 mc+=bian[ask[i]];
84 }
85 }//printf("%lld\n",maxx);
86 LL acc = cnt*(cnt-1)/(LL)2;
87 LL akk = acc;
88 acc+=maxx*cnt;
89 acc-=mc;
90 for(i = 1;i <= k;i++)
91 {
92 acc+=(LL)du[ask[c[i]]]*(LL)(du[ask[c[i]]]-1)/(LL)2;
93 acc-=bian[ask[c[i]]];
94 }
95 printf("%lld\n",acc);
96 }
97 return 0;
98 }
99 int fin(int x)
100 {
101 int i;
102 for(i = x; i!=bin[i];)
103 i = bin[i];
104 return i;
105 }

C. Hongcow Builds A Nation的更多相关文章

  1. Codeforces 744A. Hongcow Builds A Nation

    A. Hongcow Builds A Nation 题意: 现在有 n 个点 ,m 条边组成了一个无向图 , 其中有 k 个特殊点, 这些特殊点之间不能连通 ,问可以再多加几条边? 因为$x^2+y ...

  2. Codeforces Round #385 (Div. 2) Hongcow Builds A Nation —— 图论计数

    题目链接:http://codeforces.com/contest/745/problem/C C. Hongcow Builds A Nation time limit per test 2 se ...

  3. Codeforces 745C:Hongcow Builds A Nation(并查集)

    http://codeforces.com/problemset/problem/744/A 题意:在一个图里面有n个点m条边,还有k个点是受限制的,即不能从一个受限制的点走到另外一个受限制的点(有路 ...

  4. C. Hongcow Builds A Nation 并查集

    http://codeforces.com/contest/745/problem/C 把他们并查集后, 其他没有连去government的点,全部放去同一个并查集,然后选择一个节点数最多的gover ...

  5. Codeforces Round #385 (Div. 2) C - Hongcow Builds A Nation

    题目链接:http://codeforces.com/contest/745/problem/C 题意:给出n个点m条边,还有k个不能连通的点,问最多能添加几条边. 要知道如果有n个点最多的边是n*( ...

  6. Codeforces Round #385 (Div. 2) A,B,C 暴力,模拟,并查集

    A. Hongcow Learns the Cyclic Shift time limit per test 2 seconds memory limit per test 256 megabytes ...

  7. Codeforces Round #385 //再遇状压

    敲完三题挂机一小时.....  也没懂DE什么意思  rank600上了一波分... A. Hongcow Learns the Cyclic Shift 给一个字符串,每次可以把最后一个字符拿到开头 ...

  8. Codeforces Round #385 (Div. 2)A B C 模拟 水 并查集

    A. Hongcow Learns the Cyclic Shift time limit per test 2 seconds memory limit per test 256 megabytes ...

  9. cf744

    Codeforces Round #385 (Div. 1) <br > A.Hongcow Builds A Nation 贪心. 显然就是凑成一个最大的块即可 那么首先并查集处理已经确 ...

随机推荐

  1. R连接mysql数据库方法详解

    Warning messages: 1: In odbcDriverConnect("DSN=Rdata;UID=root") : [RODBC] ERROR: state IM0 ...

  2. shell 的 功能语句--1

    [1]说明性语句 (1)shell 程序和语句 shell 程序由零或多条shell语句构成. shell语句包括三类:说明性语句.功能性语句和结构性语句. 说明性语句: 以#号开始到该行结束,不被解 ...

  3. (转载) Java多线程技术

    多线程编程一直是学员们比较头痛和心虚的地方,因为线程执行顺序的不可预知性和调试时候的困难,让不少人在面对多线程的情况下选择了逃避,采用单线程的方式,其实只要我们对线程有了明确的认识,再加上java内置 ...

  4. Webpack 打包 Javascript 详细介绍

    本篇我们主要介绍Webpack打包 Javascript.当然,除了可以打包Javascript之外,webpack还可以打包html.但是这不是我们本篇的重点.我们可以参考 Webpack HTML ...

  5. HDFS03 HDFS的API操作

    HDFS的API操作 目录 HDFS的API操作 客户端环境准备 1.下载windows支持的hadoop 2.配置环境变量 3 在IDEA中创建一个Maven工程 HDFS的API实例 用客户端远程 ...

  6. day9 文件处理

    day09 文件处理 一.注册与登录功能 username = input('请输入您的密码:').strip() password = input('请输入您的密码:').strip() f = o ...

  7. Oracle—网络配置文件

    Oracle网络配置文件详解     三个配置文件 listener.ora.sqlnet.ora.tnsnames.ora ,都是放在$ORACLE_HOME/network/admin目录下. 1 ...

  8. 规范——Java后端开发规范

    Java后端开发规范 一.技术栈规约 二.命名规范 三.Java代码规范(注释规范.异常与日志.代码逻辑规范) 四.Mybatis与SQL规范 五.结果检查(单元测试及代码扫描) 六.安全规范 一.技 ...

  9. mybatis-plus条件构造用is开头的Boolean类型字段时遇到的问题

    is打头的Boolean字段导致的代码生成器与lambda构造器的冲突 https://gitee.com/baomidou/mybatis-plus/issues/I171DD?_from=gite ...

  10. Does compiler create default constructor when we write our own?

    In C++, compiler by default creates default constructor for every class. But, if we define our own c ...