Codeforces Round #544 (Div. 3)题解
E
链接:
题意:
题解:
代码:
F1 Spanning Tree with Maximum Degree
链接
题意:
题解:
注意:
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 9;
struct Edge {
int u, v, w;
bool operator < (const Edge& A)const {
return w < A.w;//按照w从小到大的顺序排列
}
}e[maxn];
int f[maxn], d[maxn], vis[maxn];
int n, m;
int find(int x)
{
return f[x] == x ? f[x] : f[x] = find(f[x]);//找到某个数对应的根节点
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
cin >> n >> m;//一共有n个结点,一共有m个路径
int maxn = 0, p;
for (int i = 1;i <= m;i++) {
int u, v;
cin >> u >> v;
e[i].u = u;
e[i].v = v;//存入数组里头
d[u]++, d[v]++;//存入的是某个结点的路径条数
if (d[u] > maxn) {
maxn = d[u];
p = u;
}
if (d[v] > maxn) {
maxn = d[v];
p = v;
}//找到某个路径条数最多的结点
}
for (int i = 0;i <= n + 1;i++)f[i] = i;//建立并查集
for (int i = 1;i <= m;i++)
{
int u = e[i].u, v = e[i].v;
if (p == u || p == v)//u或者v是那个最多的结点
{
int fx = find(u), fy = find(v);
f[fx] = fy;//用父节点一个一个连接起来
vis[i] = 1;
}
}
for (int i = 1;i <= m;i++)
{
int fx = find(e[i].u), fy = find(e[i].v);
if (fx == fy)continue;
f[fx] = fy;vis[i] = 1;
}
for (int i = 1;i <= m;i++)if (vis[i])cout << e[i].u << " " << e[i].v << endl;
return 0;
}
F2
题意:
题解:
注意:
代码:

浙公网安备 33010602011771号