首页 > 其他分享 >ACM预备队-week10(图论3)

ACM预备队-week10(图论3)

时间:2023-01-09 20:33:35浏览次数:57  
标签:week10 图论 int ++ long fa ACM maze find

1.Einstin学画画:

题目链接:P1636 Einstein学画画 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int vis[1005];
 4 int n, m;
 5 int ans;
 6 int main()
 7 {
 8     cin >> n >> m;
 9     for (int i = 1; i <= m; i++)
10     {
11         int u, v;
12         cin >> u >> v;
13         vis[u]++;
14         vis[v]++;
15     }
16     for (int i = 1; i <= n; i++)
17     {
18         if (vis[i] % 2 == 1) ans++;
19     }
20     if (ans == 0) cout<< 1;
21     else cout << ans/2;
22     return 0;
23 }

2.合根植物:

题目链接:P8654 [蓝桥杯 2017 国 C] 合根植物 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long fa[1000005];//本题数据较大,需要开long long
 4 long long vis[1000005];
 5 long long n, m, k;
 6 long long ans;
 7 int find(long long x)//查询操作
 8 {
 9     if (fa[x] == x) return x;
10     else
11     {
12         fa[x] = find(fa[x]);
13         return fa[x];
14     }
15 }
16 void merge(long long i, long long j)//合并操作
17 {
18     fa[find(i)] = find(j);
19 }
20 int main()
21 {
22     cin >> n >> m >> k;
23     for (int i = 1; i <= m * n; i++) fa[i] = i;//初始化操作
24     for (int i = 1; i <= k; i++)
25     {
26         int u, v;
27         cin >> u >> v;
28         merge(u, v);
29     }
30     for (int i = 1; i <= m * n; i++) find(i);//菊花图操作
31     for (int i = 1; i <= n * m; i++)
32     {
33         if ( vis[fa[i]] == 1) continue;
34         vis[fa[i]] = 1;
35         ans++;
36     }
37     cout << ans << endl;
38     return 0;
39 }

3.奶酪:

题目链接:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long fa[1005];//这题数据也很大,记得开long long
 4 long long n, h, r, T;
 5 long long X[1005], Y[1005], Z[1005],x,y,z;
 6 long long ans;
 7 int find(long long x)//查询操作
 8 {
 9     if (fa[x] == x) return x;
10     else
11     {
12         fa[x] = find(fa[x]);
13         return fa[x];
14     }
15 }
16 void merge(long long i, long long j)//合并操作
17 {
18     fa[find(i)] = find(j);
19 }
20 bool dis(long long x1,long long x2,long long y1, long long y2,long long z1 ,long long z2,long long r)//用于判断两球是否相切或相交
21 {
22     return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2) <= 4 * r * r;
23 }
24 int main()
25 {
26     cin >> T;
27     for (int i = 1; i <= T; i++)
28     {
29         //题目存在多组数据,每次开始记得初始化
30         memset(X, 0, sizeof(X));
31         memset(Y, 0, sizeof(Y));
32         memset(Z, 0, sizeof(Z));
33         cin >> n >> h >> r;
34         for (int j = 1; j <= n; j++) fa[j] = j;
35         fa[1001] = 1001;//1001代表底部
36         fa[1002] = 1002;//1002代表顶部
37         for (int j = 1; j <= n; j++)
38         {
39             cin >> x >> y >> z;//输入数据
40             X[j] = x, Y[j] = y, Z[j] = z;
41         }
42         for (int j = 1; j <= n; j++)
43         {
44             if (Z[j] <= r) merge(j, 1001);
45             if (Z[j] + r >= h) merge(j, 1002);
46         }
47         for (int j = 1; j <= n; j++)
48         {
49             for (int k = j + 1; k <= n; k++)
50             {
51                 if (dis(X[j], X[k], Y[j], Y[k], Z[j], Z[k], r))merge(j, k);//遍历所有点,两圆相连则加入一棵树
52             }
53         }
54         if (find(1001) == find(1002)) cout << "Yes" << endl;
55         else cout << "No" << endl;
56     }
57     return 0;
58 }

4.灾后重建:

题目链接:P1119 灾后重建 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n, m;
 4 int u, v, w;
 5 int hour[205];
 6 int maze[205][205];
 7 int main()
 8 {
 9     cin >> n >> m;
10     for (int i = 0; i < n; i++)scanf("%d", hour + i);
11     for (int i = 0; i < n; i++)
12     {
13         for (int j = 0; j < n; j++)
14         {
15             maze[i][j] = 1e9;//floyd初始化,所有点最短路设置为无限,自己到自己设置为0
16             maze[i][i] = 0;
17         }
18     }
19     for (int i = 0; i < m; i++)
20     {
21         
22         scanf("%d%d%d", &u, &v, &w);
23         maze[u][v] = w;//邻接矩阵存图
24         maze[v][u] = w;
25     }
26     int q,mark=0;
27     cin >> q;
28     for (int i = 0; i < q; i++)
29     {
30         scanf("%d%d%d", &u, &v, &w);
31         //mark = 0;//超时的元凶,实际上我们根本不需要重置mark,因为修路时间和询问时的时间都是单调不减的方式排列
32         while (hour[mark] <= w && mark < n)//floyd三重循环
33         {
34             for (int j = 0; j < n; j++)
35             {
36                 for (int k = 0; k < n; k++)
37                 {
38                     if (maze[j][k] > maze[j][mark] + maze[mark][k]) maze[j][k] = maze[j][mark] + maze[mark][k];
39                 }
40             }
41             mark++;
42         }
43         if (hour[u] > w || hour[v] > w )cout << -1 << endl;//如果出发地或目的地村庄还未重建完成
44         else
45         {
46             if (maze[u][v] == 1e9) cout << -1 << endl;//若没有路径
47             cout << maze[u][v] << endl;
48         }
49     }
50     return 0;
51 }

5.聪明的猴子:

题目链接:P2504 [HAOI2006]聪明的猴子 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n, m, ans;
 4 double x[1005], y[1005];
 5 int fa[1005];//并查集中的数组
 6 int d[505];
 7 struct node
 8 {
 9     int x, y;
10     double d;
11 }e[1000005];
12 bool cmp(node a, node b)
13 {
14     return a.d < b.d;//结构体排序
15 }
16 int find(int x)//并查集查询
17 {
18     if (fa[x] == x) return x;
19     else
20     {
21         fa[x] = find(fa[x]);
22         return fa[x];
23     }
24 }
25 void merge(int i, int j)//并查集合并
26 {
27     fa[find(i)] = find(j);
28 }
29 int main()
30 {
31     cin >> n;
32     for (int i = 1; i <= n; i++) cin >> d[i];
33     cin >> m;
34     for (int i = 1; i <= m; i++)cin >> x[i] >> y[i];
35     int cnt = 0;
36     for (int i = 1; i <= m; i++)//计算两树距离
37     {
38         for (int j = i+1; j <= m; j++)
39         {
40             cnt++;
41             e[cnt].x = i;
42             e[cnt].y = j;
43             e[cnt].d = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
44         }
45     }
46     sort(e + 1, e + 1 + cnt, cmp);//从小到大排序
47     for (int i = 1; i <= m; i++) fa[i] = i;//并查集初始化
48     double M = 0;//存储最大值的变量
49     for (int i = 1; i <= cnt; i++)
50     {
51         if (find(e[i].x) != find(e[i].y))//若二者的根节点不同
52         {
53             merge(e[i].x, e[i].y);
54             M = max(M, e[i].d);
55         }
56     }
57     for (int i = 1; i <= n; i++)
58     {
59         if (d[i] >= M)ans++;
60     }
61     cout << ans;
62     return 0;
63 }

 

标签:week10,图论,int,++,long,fa,ACM,maze,find
From: https://www.cnblogs.com/Zac-saodiseng/p/17038452.html

相关文章

  • ACM&OI 多项式算法专题
    ACM&OI基础数学算法专题一、FFT基础拉格朗日插值复数的运算性质和几何性质单位根和单位根反演快速傅里叶变换(FFT)的分治实现快速傅里叶逆变换(IFFT)快速傅里叶变换的......
  • 2022ACM寒假第一周训练部分题目代码
    在比赛结束后可以查看其他人的代码,这样的是可以查看,若非绿色则对方没公开。1周一1.1A链表应用#include<iostream>#include<list>usingnamespacestd;/*......
  • Codeforces - 1656E - Equal Tree Sums(构造 + 树论 + 图论 + 搜索、结论题、*2200)
    1656E-EqualTreeSums(⇔源地址)目录1656E-EqualTreeSums(⇔源地址)tag题意思路AC代码错误次数:0tag⇔*2200、⇔构造、⇔树论、⇔图论、⇔搜......
  • 通关搜索和图论 day_14 -- Dijkstra(朴素版 + 堆优化版)
    最短路分为单源最短路和多源汇最短路单源一般是求从一个点到其他所有点的最短距离源点---起点 汇点---终点多源就是会有很多个询问,起点和终点都是不确定的单源......
  • 学习-图论
    概念置换环以下内容来自ChatGpt:置换环是一个置换的一部分,其中包含一个或多个点的映射。每个点都映射到了另一个点,而最后一个点又映射回了第一个点。因此,置换环可以被看......
  • #ACM2021_23. 摘柿子 and#ACM2021_34. 幸运数字
    #ACM2021_23.摘柿子:一道很简单的排序题,估计是送分题(俺的做法:#include<stdio.h>#include<stdlib.h>#defineN100#defineM100intmain(){intn;//n为柿子个......
  • 通关搜索和图论 day_13 -- 树和图的深搜和宽搜和拓扑排序
    树和图的存储树是一种特殊的图,无环连通图图分为有向图和无向图如果是无向图就建立两个边a->b&&b->a,所有无向图就是特殊的有向图邻接矩阵g[a,b]记录a->b......
  • #ACM2021_25. 有关2022
    今天整了个小题,但可惜超时了(悲我之前的做法(暴力枚举,但超时)#include<stdio.h>#include<string.h>intmain(intargc,constchar*argv[]){inta,b,c,d,e,sum......
  • 为什么QQ能帮你找到失散多年的兄弟?----图论
    为什么qq里“可能认识的人”功能推荐的如此精准?为什么两个没有什么联系的朋友会相互认识?一切的背后到底是道德的沦丧,还是人性的扭曲?让我们走进图的内心世界!什么是图?微信......
  • 1055. Combinations -- ACM RU
    1055.Combinationshttps://acm.timus.ru/problem.aspx?space=1&num=1055 思路对于组合数C(M,N)不能使用公式计算最终值,然后再根据最终值,分解质因数,统计质因数个数;......