CodeForces - 744A Hongcow Builds A Nation
2017-02-18 20:41
169 查看
原题链接
思路:
先利用已给的边求出每个政府树的顶点数(深度搜索)
选出顶点数最多的政府树,将剩余的与政府点不连通的点加入该树
此时所有的点被分为k组,将每组中的点全部连同,可以得到最大总边数,减去已有边就是答案。
思路:
先利用已给的边求出每个政府树的顶点数(深度搜索)
选出顶点数最多的政府树,将剩余的与政府点不连通的点加入该树
此时所有的点被分为k组,将每组中的点全部连同,可以得到最大总边数,减去已有边就是答案。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <queue> #include <vector> #include <set> #define INF 100000000 using namespace std; int n, m, k; //总点数,已有边数,政府数(树数) int c[1050]; //政府所在点 vector<int> g[1050]; //g[i]中有所有与i直接相连的点 int v, vmax, res; bool vis[1050]; void dfs(int s) { int i; v++; vis[s] = true; //s点已经在某个政府树中 for(i = 0; i < g[s].size(); i++){ int p = g[s][i]; if(!vis[p]){ vis[p] = true; dfs(p); } } } int main() { int i, j; scanf("%d %d %d", &n, &m, &k); for(i = 0; i < k; i++){ scanf("%d", &c[i]); } for(i = 1; i <= m; i++){ int b, c; scanf("%d %d", &b, &c); g[b].push_back(c); g[c].push_back(b); } for(i = 0; i < k; i++){ v = 0; //与该政府顶点同树的点 dfs(c[i]); res += v*(v-1)/2; //先将每个政府顶点所在树上的点全部相连 n -= v; //剩余与任何政府顶点不同树的点减少v vmax = max(vmax, v); //找出所有政府顶点所在树中顶点数最多的树 } res += n*(n-1)/2; //将剩余所有无法到达政府顶点的点相互连接 res += n*vmax; //将这些点与已有的点数最多的树相连 res -= m; //减去已有的边 printf("%d\n",res); return 0; }
相关文章推荐
- Codeforces 230A
- codeforces 591B - Rebranding(模拟)
- CodeForces 101D Castle (贪心)
- CodeForces 740C - Alyona and mex(思维)
- codeforces 724G. Xor-matic Number of the Graph
- Mahmoud and a Dictionary CodeForces - 766D
- Codeforces 449B - Jzzhu and Cities / 450D - Jzzhu and Cities
- Codeforces 590B Chip 'n Dale Rescue Rangers
- Codeforces 2 A. Winner
- codeforces 721D D. Maxim and Array (STL||优先队列)
- Codeforces Ultra-Fast Mathematician
- Codeforces 859D - Third Month Insanity
- CodeForces 1A
- Codeforces 590B Chip 'n Dale Rescue Rangers
- CODEFORCES 270C Magical Boxes <<小箱子装大箱子>>
- CodeForces 140 C. New Year Snowmen 详解 (贪心+优先队列)
- codeforces 799C Fountains 线段树
- codeforces 876F High Cry (思维,位运算)
- Codeforces_450B_Jzzhu and Sequences(循环节or矩阵快速幂)
- #Codeforces 323 [div2] D. Once Again 【优化dp】