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

题意:
题解:
注意:
代码:

posted @ 2020-12-17 20:32  Aaryn21  阅读(51)  评论(0)    收藏  举报