//构建有向无环图模型,求最长路径。
#include <stdio.h>
#include <string.h>
#define maxn 100
int G[maxn][maxn];
int d[maxn];
typedef struct node{
int x, y;
}node;
node vex[maxn];
int n;
int cmp(int i, int j){
if(vex[i].x < vex[j].x && vex[i].y < vex[j].y) return -1;
if(vex[i].x < vex[j].y && vex[i].y < vex[j].x) return -1;
if(vex[i].x > vex[j].x && vex[i].y > vex[j].y) return 1;
if(vex[i].x > vex[j].y && vex[i].y > vex[j].x) return 1;
return 0;
}
int dp(int i){
int *t = &d[i];
if(*t) return *t;
*t = 1;
int j, tmp;
for(j = 0; j < n; ++j)
if(G[i][j] && *t < (tmp = dp(j) + 1)) *t = tmp;
return *t;
}
void print(int p){
int i;
printf("%d %d\n ", vex[p].x, vex[p].y);
for(i = 0; i < n; ++i){
if(G[p][i] && d[p] == d[i]+1){
print(i);
break;
}
}
}
int main(){
int i, j, max = 0, pos;
memset(d, 0, sizeof(d));
memset(G, 0, sizeof(G));
scanf("%d", &n);
for(i = 0; i < n; ++i){
scanf("%d%d", &vex[i].x, &vex[i].y);
for(j = 0; j < i; ++j){
int c = cmp(i, j);
if(c == -1)
G[i][j] = 1;
else if(c == 1)
G[j][i] = 1;
}
}
for(i = 0; i < n; ++i){
if(!d[i]) dp(i);
if(max < d[i]){
max = d[i];
pos = i;
}
}
printf("max = %d\n", d[pos]);
print(pos);
return 0;
}
一道类似题目的链接http://acm.nyist.net/JudgeOnline/problem.php?pid=16,代码如下
#include <stdio.h>
#include <string.h>
#define maxn 1000
int G[maxn][maxn];
int d[maxn];
typedef struct node{
int x, y;
}node;
node vex[maxn];
int n;
int cmp(int i, int j){
if(vex[i].x < vex[j].x && vex[i].y < vex[j].y) return -1;
if(vex[i].x < vex[j].y && vex[i].y < vex[j].x) return -1;
if(vex[i].x > vex[j].x && vex[i].y > vex[j].y) return 1;
if(vex[i].x > vex[j].y && vex[i].y > vex[j].x) return 1;
return 0;
}
int dp(int i){
int *t = &d[i];
if(*t) return *t;
*t = 1;
int j, tmp;
for(j = 0; j < n; ++j)
if(G[i][j] && *t < (tmp = dp(j) + 1)) *t = tmp;
return *t;
}
int main(){
int i, j, max , w;
scanf("%d", &w);
while(w--){
memset(d, 0, sizeof(d));
memset(G, 0, sizeof(G));
max = 0;
scanf("%d", &n);
for(i = 0; i < n; ++i){
scanf("%d%d", &vex[i].x, &vex[i].y);
for(j = 0; j < i; ++j){
int c = cmp(i, j);
if(c == -1)
G[i][j] = 1;
else if(c == 1)
G[j][i] = 1;
}
}
for(i = 0; i < n; ++i){
if(!d[i]) dp(i);
if(max < d[i])
max = d[i];
}
printf("%d\n", max);
}
return 0;
}