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