#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;
int T,m;
bool smallest[32];
bool biggest[32];
int s[32][32];
bool map[32][32];
int f[32];
int begain;
int deg[32];
int result[32];
int deg_copy[32];
int visited[32];
void creat(int count,int dime)
{
for(int i=0;i<count;i++)
{
bool success1=true;
bool success2=true;
for(int j=0;j<dime;j++)
{
if(s[count][j]==s[i][j])
{
success1=false;
success2=false;
break;
}
if(s[count][j]<=s[i][j])
{
success1=false;
}
if(s[count][j]>=s[i][j])
{
success2=false;
}
}
if(success1)
{
map[count][i]=true;
biggest[i]=false;
smallest[count]=false;
deg[count]++;
}
if(success2)
{
map[i][count]=true;
smallest[i]=false;
biggest[i]=false;
deg[i]++;
}
}
}
void print(int s)
{
for(int i=s-1;i>=0;i--)
{
if(map[result[s]][result[i]]==true)
if(f[s]==f[i]+1)
{
print(i);
break;
}
}
if(s!=begain)
printf("%d ",result[s]+1);
else
printf("%d",result[s]+1);
}
/*
int dp(int i)
{
if(f[i]>0)
return f[i];
if(smallest[i]==true)
return f[i]=1;
int max=-1;
for(int j=0;j<T;j++)
{
if(map[i][j]==true)
{
if(max<dp(j)+1)
max=dp(j)+1;
}
}
return f[i]=max;
}*/
void topsort()
{
int current=0;
queue<int> q;
for(int i=0;i<T;i++)
{
if(deg[i]==0)
q.push(i);
}
int temp;
while(!q.empty())
{
temp=q.front();
q.pop();
result[current++]=temp;
for(int i=0;i<T;i++)
{
if(map[i][temp]==true)
{
deg[i]--;
if(deg[i]==0)
q.push(i);
}
}
}
}
int dp()
{
int maxx=1;
int i;
for( i=0;i<T;i++)
{
if(deg_copy[result[i]]==0)
visited[i]=true;
}
for(int j=0;j<T;j++)
{
if(!visited[j])
{
int max=-4;
for(int k=j;k>=0;k--)
{
if(map[result[j]][result[k]]==true)
{
if(f[k]+1>max)
max=f[k]+1;
}
}
f[j]=max;
if(maxx<max)
{
maxx=max;
begain=j;
}
}
}
return maxx;
}
int main()
{
while(scanf("%d%d",&T,&m)!=EOF)
{
for(int i=0;i<T;i++)
biggest[i]=true;
for(int i=0;i<T;i++)
smallest[i]=true;
for(int i=0;i<T;i++)
f[i]=1;
memset(result,0,sizeof(result));
memset(visited,0,sizeof(visited));
memset(deg,0,sizeof(deg));
memset(map,0,sizeof(map));
int temp[12];
for(int i=0;i<T;i++)
{
for(int j=0;j<m;j++)
{
//scanf("%d",&s[i][j]);
scanf("%d",&temp[j]);
}
sort(temp,temp+m);
for(int k=0;k<m;k++)
s[i][k]=temp[k];
creat(i,m);
}
/* for(int i=0;i<T;i++)
{
if(biggest[i]==true)
{
ans=dp(i);
begain=i;
break;
}
}*/
for(int i=0;i<T;i++)
{
deg_copy[i]=deg[i];
}
topsort();
int ans=dp();
printf("%d\n",ans);
print(begain);
printf("\n");
}
}
嵌套矩阵+拓扑排序+循环
最新推荐文章于 2024-01-08 16:58:17 发布