题目链接:点击打开链接
刘汝佳的小白皮的DAG矩形嵌套问题,但不要输出字典序最小路径
#include<iostream>
#include<cstdio>
#include<cstring>
typedef struct node
{
int x,y; //x长y宽
} node;
using namespace std;
const int maxn=1000+10;
int n,Max;
node a[maxn];
int d[maxn],G[maxn][maxn];
int dp(int i)
{
if(d[i]>0)return d[i];
d[i]=1;
for(int j=0; j<n; j++)
if(G[i][j])
d[i]=max(dp(j)+1,d[i]);
return d[i];
}
int main()
{
int t,i,j;
scanf("%d ",&t);
while(t--)
{
Max=0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d %d",&a[i].x,&a[i].y);
if(a[i].x<a[i].y)swap(a[i].x,a[i].y);
}
memset(G,0,sizeof(G));
memset(d,0,sizeof(d));
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if(a[i].x>a[j].x&&a[i].y>a[j].y)G[i][j]=1;
for(i=0; i<n; i++)
{
dp(i);
Max=(Max<d[i]?d[i]:Max);
}
printf("%d\n",Max);
}
}
输出路径的:
#include<iostream>
#include<cstdio>
#include<cstring>
typedef struct node
{
int x,y; //x长y宽
} node;
using namespace std;
const int maxn=1000+10;
int n,Max;
node a[maxn];
int d[maxn],G[maxn][maxn];
int dp(int i)
{
if(d[i]>0)return d[i];
d[i]=1;
for(int j=0; j<n; j++)
if(G[i][j])
d[i]=max(dp(j)+1,d[i]);
return d[i];
}
void print_ans(int i)
{
printf("%d ",i+1);
for(int j=0;j<n;j++)
if(G[i][j]&&d[i]==d[j]+1)
{
print_ans(j);
break;
}
}
int main()
{
int t,i,j,start;
scanf("%d ",&t);
while(t--)
{
Max=0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d %d",&a[i].x,&a[i].y);
if(a[i].x<a[i].y)swap(a[i].x,a[i].y);
}
memset(G,0,sizeof(G));
memset(d,0,sizeof(d));
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if(a[i].x>a[j].x&&a[i].y>a[j].y)G[i][j]=1;
for(i=0; i<n; i++)
{
dp(i);
if(d[i]>Max)
{
Max=d[i];
start=i;
}
}
printf("%d\n",Max);
print_ans(start);
}
}