DAG模型的复习,始终AC不了,不知为何~~~~(>_<)~~~~
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#define SIZE 35
#define MAX(A,B) (A>B?A:B)
using namespace std;
vector<int> vct[SIZE];
int vis[SIZE], d[SIZE];
int row, col, ians;
int is(int a, int b) { // a包含b
vector<int> &aa = vct[a];
vector<int> &bb = vct[b];
for(int i = 0; i < col; i++) {
if(aa[i] <= bb[i]) return 0;
}
return 1;
}
int dp(int i) {
int t = 1;
if(vis[i]) return d[i];
vis[i] = 1;
for(int j = 1; j <= row; j++) {
if(j != i && is(i, j)) {
t = MAX(t, dp(j)+1);
}
}
d[i] = MAX(d[i], t);
return d[i];
}
void print_path(int i) {
for(int j = 1; j <= row; j++) {
if(d[i] == d[j]+1 && is(i, j)) {
print_path(j);
break;
}
}
if(ians == i) printf("%d", i);
else printf("%d ", i);
}
int main() {
int t;
int i;
int ans;
while(scanf("%d%d", &row, &col) != EOF) {
memset(vis, 0, sizeof(vis));
memset(d, 0, sizeof(d));
ans = ians = 0;
for(i = 0; i <= row; i++) {
vct[i].clear();
}
for(i = 1; i <= row; i++) {
for(int j = 0; j < col; j++) {
scanf("%d", &t);
vct[i].push_back(t);
}
sort(vct[i].begin(), vct[i].end());
}
for(i = 1; i <= row; i++) {
ans = MAX(ans, dp(i));
ians = i;
}
for(i = 1; i <= row ; i++) printf("%d ", d[i]);
printf("%d\n", ans);
print_path(ians);
printf("\n");
}
return 0;
}