P10678 『STA - R6』月 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
挺意外的一個題,從黃色到藍色。
貪心思想比較好想,儘量把度數多的連在一起。這樣會形成一箇中心聚集的圖,就可以使得最長直徑儘量小。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 200010;
int n, m;
struct Node
{
int x, id;
bool operator<(const Node &W)const
{
return W.x < x;
}
}g[N];
int main()
{
int T;
cin >> T;
while (T -- )
{
cin >> n;
for (int i = 1; i <= n; i ++ )
{
int a, b;
cin >> a;
g[i] = {a, i};
}
sort(g + 1, g + 1 + n);
int last = 2;
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= g[i].x; j ++ )
{
if (last > n) continue;
printf("%d %d\n", g[last].id, g[i].id);
g[last].x -- ;
last ++ ;
}
}
}
return 0;
}