zoukankan      html  css  js  c++  java
  • 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;
        } 
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    hdu 4638 Group 线段树
    hdu 4635 Strongly connected 强连通分量
    hdu 4604 Deque
    hdu 1000 A + B Problem
    数组相关
    文本文件相关
    硬件电路中VCC,VDD,VEE,VSS有什么区别
    VIPM链接LabVIEW问题
    Touch实现轻扫
    touchesMoved 实现拖拽
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7467843.html
Copyright © 2011-2022 走看看