Codeforces Round #544 (Div. 3)題解
阿新 • • 發佈:2020-12-17
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
題意:
題解:
注意:
程式碼: