标签:scan sprint cout get 一个 cst 字典序 strlen lan
★★☆ 输入文件:zpj.in
输出文件:zpj.out
简单对比
时间限制:1 s 内存限制:128 MB
6
0 1 1 1 0 0
1 0 0 1 0 0
1 0 0 0 1 0
1 1 0 0 0 1
0 0 1 0 0 1
0 0 0 1 1 0
2
5
1 5
1 6
2 5
3 4
4 5
思路:呵呵哒
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXV 101 #define MOD 1000003 using namespace std; int n,minn=1000,ans; char buf[20000],tmp[2000]; bool e[MAXV][MAXV],pkd[MAXV],ht[MOD]; bool try_insert(){ unsigned int hv=0,fac=1; for(int i=1;i<=n;i++){ if(pkd[i]){ hv+=fac; hv%=MOD; } fac*=2; fac%=MOD; } if(ht[hv]) return false; else return ht[hv]=1; } void dfs(int u,int now){ if(now>minn) return; //剪枝 if(u>n){ if(now<minn) minn=now,ans=0,buf[0]=0;//更新最小值。 if(!try_insert()) return; //剪枝 tmp[0]=0; ans++; for(int i=1;i<=n;i++) if(pkd[i]) sprintf(tmp+strlen(tmp),"%d ",i); sprintf(tmp+strlen(tmp),"\n"); strcat(buf,tmp); } else { bool flag=0; for(int v=1;v<=n;v++) if(e[u][v]) if(pkd[v]){ if(!flag) flag=1,dfs(u+1,now); } else{ pkd[v]=1; dfs(u+1,now+1); pkd[v]=0; } } } int main(){ freopen("zpj.in","r",stdin); freopen("zpj.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ cin>>e[i][j]; if(i==j) e[i][j]=1; } dfs(1,0); //从1号节点开始修建,已经修建了0个站台。 cout<<minn<<endl<<ans<<endl<<buf; }
标签:scan sprint cout get 一个 cst 字典序 strlen lan
原文地址:http://www.cnblogs.com/cangT-Tlan/p/7467517.html