cogs 10. 信号无错传输

10. 信号无错传输

★★☆   输入文件:dlj.in   输出文件:dlj.out   简单对比
时间限制:1 s   内存限制:128 MB

【问题描述】
为提高传递信息的保密性和可靠性,两个军事基地用几套专用编码传输信号。传递信号过程中,发现某些编码在传递过程中容易混淆,影响了信息传输质量。请你在已有的编码中进行精简,既要保证传输过程中不发生混淆,又要尽量使编码集中可用编码尽量多,请你给出新的编码设计方案。
【输入格式】
输入文件有若干行
第一行,一个整数n,表示该编码规则共有n种信号(2<=n<=100)
下面有n行,每行有n个数字。第p行第q列的数字表示信号p与信号q之间是否可能混淆。数字为1表示有可能混淆,0表示不会混淆。
【输出格式】
输出文件有若干行
第一行,一个整数a,表示精简后的编码规则中有a个信号。
第二行,一个整数b,表示最佳精简方案有b种。
第3--b+2行,每行b个整数,表示一种精简方案。多种方案输出时,输出顺序按信号编号由小到大字典序输出。
【输入文件】

0 1 1 1 0 0 
1 0 0 1 0 0 
1 0 0 1 0 0 
1 1 1 0 1 1 
0 0 0 1 0 1 
0 0 0 1 1 0 
【输出文件】

2
2 3 5 
2 3 6
思路:搜索,然而我并不知道标签的最值子图是神马鬼。具体见代码。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans,sum,map[110][110],v[110][110],f[110][110];
int use[110];
bool judge(int x){
    for(int i=1;i<=x;i++)    //要保证字典序,不出现重复。 
        if(map[x][i]&&use[i]) 
            return false;
    return true;
}
void dfs(int t,int now){    //搜索到第t个点,当前留下的点的个数为now个。 
    if(ans-now>n-t+1)    return ;     
    if(t>n){
        if(now>ans)    sum=0;
        memcpy(v[++sum],use,sizeof(use));    //记录选点的情况。 
        ans=now;
        return ;
    }
    if(judge(t)&&!use[t]){    //判断一个点是否能被留下。 
        use[t]=1;            //如果与这个点相连的点中没有被选中的并且这个点没有入选。 
        dfs(t+1,now+1);
        use[t]=0;
    }
    dfs(t+1,now);    //不能被留下,继续找下一个点。 
}
int main(){
    //freopen("dlj.in","r",stdin);
    //freopen("dlj.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int falg=0;
        for(int j=1;j<=n;j++){
            scanf("%d",&map[i][j]);
            if(map[i][j])    falg=1;    
        }
        if(falg==0){
            use[i]=1;            //use记录点是否被选中留下。 
            ans++;                //ans记录留下的点的个数。 
        }
    }
    dfs(1,ans);    //从第一个点开始搜索,当前留下的点的个数为ans个。 
    cout<<ans<<endl<<sum<<endl;
    for(int i=1;i<=sum;i++){
        for(int j=1;j<=n;j++)
            if(v[i][j])
                printf("%d ",j);
        cout<<endl;
    } 
}

 

posted @ 2017-09-02 21:07  一蓑烟雨任生平  阅读(196)  评论(0编辑  收藏  举报