题目:
题目大意:
给定一个n,k代表有2n个点,k条边。让你给剩下来2(n-k)个点连线,让所得的点最多。
思路:
是一个贪心的思路,筛选出没有连接上的点,把没有连接上的点第一个和中间连,第二个和中间开始第二个连,以此类推,再计算出点的个数。
Code:
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n, k;
cin >> n >> k;
vector<vector<int>>a(k, vector<int>(2, 0));
for (int i = 0; i < k; ++i) {
cin >> a[i][0] >> a[i][1];
}
vector<int>flag(2 * n + 1, 0);
for (int i = 0; i < k; ++i) {
flag[a[i][0]] = a[i][1];
flag[a[i][1]] = a[i][0];
}
vector<int>zero;
for (int i = 1; i <= 2 * n; ++i) {
if (flag[i] == 0) zero.push_back(i);
}
int len = zero.size();
int ans = 0;
for (int i = 0; i < len / 2; ++i) {
flag[zero[i]] = zero[i + len / 2];
flag[zero[i + len / 2]] = zero[i];
}
for (int i = 1; i <= 2 * n; ++i) {
for (int j = i; j <= flag[i]; ++j) {
if ((flag[j] > flag[i] || flag[j] < i)) ans++;
}
}
cout << ans / 2 << endl;
}
int main(void) {
int t; cin >> t; while (t--)
solve();
return 0;
}