您的位置:首页 > 其它

最长路及其字典序输出所有解

2014-05-15 21:00 162 查看
#include<stdio.h>

#include<string.h>

int a[110],b[110];

int g[110][110];

int d[110];

int ans[110];

int n;

int cnt;

int tot;

void print_ans(int i,int maxs){

int j,k;

ans[cnt++] = i;

if(cnt>=maxs){

printf("Case %d:",tot++);

for(k = 0;k<cnt;k++) printf("%d ",ans[k]);

printf("\n");

}

for(j = 1;j<=n;j++){

if(g[i][j] && d[i] == d[j]+1){

print_ans(j,maxs);

cnt--;

}

}

}

int DP(int i){

int j;

int &ans = d[i];

if(ans>0) return ans;

ans = 1;

for(j = 1;j<=n;j++){

if(g[i][j]) {

int temp = DP(j)+1;

if(ans<temp) ans = temp;

}

}

return ans;

}

int main(){

int i,j;

int maxs,index;

while(scanf("%d",&n)!=EOF){

for(i = 1;i<=n;i++){

scanf("%d%d",&a[i],&b[i]);

}

memset(g,0,sizeof(g));

memset(d,-1,sizeof(d));

for(i = 1;i<=n;i++){

for(j = 1;j<=n;j++){

if((a[i]<b[j]&&b[i]<a[j])||(a[i]<a[j] && b[i]<b[j])) g[i][j] = 1;

}

}

for(i = 1;i<=n;i++){

for(j = 1;j<=n;j++) printf("%d ",g[i][j]);

printf("\n");

}

index = 1;

maxs = 1;

for(i = 1;i<=n;i++){

int temp = DP(i);

if(maxs<temp){

maxs = temp;

index = i;

}

}

printf("%d\n",maxs);

cnt = 0;

tot = 1;

print_ans(index,maxs);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐