1. 程式人生 > 實用技巧 >Codeforces Round #544 (Div. 3)題解

Codeforces Round #544 (Div. 3)題解

E

連結:
題意:
題解:
程式碼:

F1 Spanning Tree with Maximum Degree

連結:https://codeforces.ml/contest/1133/problem/F1
題意:
題解:
注意:
程式碼:

#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

題意:
題解:
注意:
程式碼: