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

来源:互联网 发布:捕鱼达人源码 编辑:程序博客网 时间:2024/04/29 06:36
#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;
}
0 0
原创粉丝点击