【codeforces 19/11/06 div2】D. 0-1 MST

  1 #include<iostream>
  2 #include<set>
  3 #include<map>
  4 #include<queue>
  5 #include<algorithm>
  6 using namespace std;
  7
  8 const int maxn = 100010;
  9 int n, m;
 10 set<int>e[maxn];
 11 set<int>node;
 12 int fa[maxn];
 13 int sz[maxn];
 14
 15 int find(int x)
 16 {
 17     if (fa[x] == x) return x;
 18     fa[x] = find(fa[x]);
 19     return fa[x];
 20 }
 21
 22 void merge(int a, int b)
 23 {
 24     int fx = find(a);
 25     int fy = find(b);
 26     fa[fx] = find(fy);
 27     sz[fy] += sz[fx];
 28 }
 29
 30 bool check(int a, int b)
 31 {
 32     return find(a) == find(b);
 33 }
 34
 35 void dfs(int x)
 36 {
 37     set<int>reach;
 38     for (auto it : node)
 39     {
 40         if (e[x].find(it) == e[x].end())
 41         {
 42             reach.insert(it);
 43         }
 44     }
 45     for (auto it : reach)
 46     {
 47         node.erase(it);
 48     }
 49     for (auto it : reach)
 50     {
 51         dfs(it);
 52     }
 53 }
 54
 55 int main()
 56 {
 57     cin >> n >> m;
 58     for (int i = 1; i <= n; i++)
 59     {
 60         fa[i] = i;
 61         node.insert(i);
 62     }
 63     for (int i = 1; i <= m; i++)
 64     {
 65         int a, b;
 66         cin >> a >> b;
 67         e[a].insert(b);
 68         e[b].insert(a);
 69     }
 70     /*
 71     //dfs做法
 72     int ans = 0;
 73     for (int i = 1; i <= n; i++)
 74     {
 75         if (node.find(i) != node.end())
 76         {
 77             dfs(i);
 78             ans++;
 79         }
 80     }
 81     */
 82     //正解:并查集
 83     vector<int>g;
 84     for (int i = 1; i <= n; i++)
 85     {
 86         sz[i] = 1;
 87         map<int, int>cnt;
 88         for (auto it : e[i])
 89         {
 90             if (it >= i) continue;
 91             cnt[find(it)]++;
 92         }
 93         for (auto it : g)
 94         {
 95             int t = find(it);
 96             if (check(i, t)) continue;
 97             if (sz[t] > cnt[t])
 98             {
 99                 merge(i, t);
100             }
101         }
102         int fi = find(i);
103         if (fi == i) g.push_back(fi);
104     }
105     int ans = 0;
106     for (int i = 1; i <= n; i++)
107     {
108         if (fa[i] == i) ans++;
109     }
110     cout << ans - 1;
111     return 0;
112 }
113  

原文地址:https://www.cnblogs.com/thjkhdf12/p/11823961.html

时间: 2025-01-12 13:24:59

【codeforces 19/11/06 div2】D. 0-1 MST的相关文章

【codeforces 19/11/06 div2】A. Maximum Square

1 #include<iostream> 2 #include<algorithm> 3 #include<map> 4 using namespace std; 5 6 map<int, int>cnt; 7 8 int main() 9 { 10 int T; 11 cin >> T; 12 while (T--) 13 { 14 cnt.clear(); 15 int n; 16 cin >> n; 17 for (int i

【codeforces 19/11/06 div2】C. Tile Painting

1 #include <iostream> 2 using namespace std; 3 4 typedef long long LL; 5 6 LL gcd(LL a, LL b) 7 { 8 if (!b) return a; 9 return gcd(b, a % b); 10 } 11 12 int min(int a, int b) 13 { 14 return a < b ? a : b; 15 } 16 17 int main() 18 { 19 LL x; 20 ci

【codeforces 19/10/24 div2】C. Minimize The Integer

1 #include<iostream> 2 #include<string> 3 #include<queue> 4 #include<stack> 5 #include<vector> 6 #include<map> 7 #include<cstdio> 8 #include<cstdlib> 9 #include<algorithm> 10 #include<set> 11 #in

【codeforces 19/10/26 div2】E.Rock In Push

1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 6 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++) 7 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--) 8 typedef long long int LL; 9

【动态标绘演示系统】v2.0 Flex版

动态标绘演示系统v2.0主要用来满足各行业WebGIS系统中对动态标绘的需求而开发.该系统基于动态标绘API(Plot API)开发. 动态标绘API是基于ArcGIS API for Flex实现的一套功能组件.通过扩展,Plot API实现了类似ArcGIS API for Flex中DrawTool和EditTool的功能,可绘制.编辑(包括对标绘图形的旋转.缩放,对标绘图形  控制点的拖拽等)各种标绘图形,具有很强的灵活性和交互性. Plot API提供了包括箭标.旗标.区域标绘等11种

【Codeforces Global Round 1 C】Meaningless Operations

[链接] 我是链接,点我呀:) [题意] 给你一个a 让你从1..a-1的范围中选择一个b 使得gcd(a^b,a&b)的值最大 [题解] 显然如果a的二进制中有0的话. 那么我们就让选择的b的二进制中对应的位置为1 剩下全为0就好 这样a的二进制全都变成1之后就是答案了(gcd的右边是0). 但是如果a的二进制里面全是1的话. 就没办法这么构造了 这里有两种情况. ①.1的个数是偶数 那么就101010这样构造 另外一个数就是010101 答案就是010101转换成十进制 ②.1的个数是奇数

【codeforces VK Cup Round 1】BDE题解

B. Group Photo 2 (online mirror version) time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output Many years have passed, and n friends met at a party again. Technologies have leaped forward since the

【Codeforces Round#279 Div.2】B. Queue

这题看别人的.就是那么诚实.http://www.cnblogs.com/zhyfzy/p/4117481.html B. Queue During the lunch break all n Berland State University students lined up in the food court. However, it turned out that the food court, too, has a lunch break and it temporarily stopp

【 Codeforces Global Round 1 B】Tape

[链接] 我是链接,点我呀:) [题意] x轴上有m个连续的点,从1标号到m. 其中有n个点是特殊点. 让你用k段区间将这n个点覆盖. 要求区间的总长度最小. [题解] 一开始假设我们需要n个胶带(即包含每一个点) 然后因为k<=n 所以可能胶带不够用. 那么就得一个胶带跨过两个点. 怎么选择最好呢? 可以把b[i]-b[i-1]-1处理出来排个序. (优先取较小的花费) 然后取前n-k个累加和sum. 因为每取一个就少用一段胶带. 然后sum+n就是答案了 [代码] import java.i