矩形嵌套
时间限制:3000 ms | 内存限制:65535 KB
难度:4
描述
有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <queue>
using namespace std;
const int maxn = 1010;
int maxnum, n;
vector<vector<int> > G(maxn);
int a[maxn], b[maxn], d[maxn];
void add_edge()
{
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (a[i] < a[j] && b[i] < b[j]) {
G[j].push_back(i);
}
}
}
}
int dp(int i)
{
int &ans = d[i];
if (ans > 0) return ans;
ans = 1;
for (int j = 0; j < G[i].size(); j++) {
int v = G[i][j];
ans = max (ans, dp (v) + 1);
}
maxnum = max (maxnum, ans);
return ans;
}
void print_ans(int i)
{
printf ("%d ", i);
for (int j = 0; j < G[i].size(); j++) {
int v = G[i][j];
if (d[i] == d[v] + 1) {
print_ans (v);
break;
}
}
}
int main()
{
int t;
scanf ("%d", &t);
while (t--) {
scanf ("%d", &n);
maxnum = 0;
memset (a, 0, sizeof(a));
memset (b, 0, sizeof(b));
memset (d, 0, sizeof(d));
for (int i = 1; i <= n; i++) {
G[i].clear();
}
for (int i = 1; i <= n; i++) {
scanf ("%d%d", &a[i], &b[i]);
if (a[i] > b[i]) swap (a[i], b[i]);
}
add_edge ();
for (int i = 1; i <= n; i++) {
dp (i);
}
for (int i = 1; i <= n; i++) {
if (d[i] == maxnum) {
print_ans (i);
break;
}
}
}
return 0;
}