搜索算法-培训技巧.ppt

  1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
搜索算法-培训技巧

深度优先搜索全过程 void search(){ int res=0,i; for(i=0;i<MAXN;++i) mark[i]=false; for(i=1;i<=n;++i){ if(!mark[i]){ ++res; dfs(i); } } cout<<res<<endl; } 主程序 int main(){ while(cin>>n>>e) { input(); search(); } return 0; } 2、通讯团体 问题描述: 有一家通讯公司近来要推出一项优惠活动,凡是在某个群体中相互通话的用户可以得到某种通话费折扣优惠。A、B两个用户相互通话是指其中之一(如A)与另一个人(如B)打过电话,而不必要求B打电话给A。 一个群体G要满足通讯公司的优惠政策,它必须满足两个条件: (1)G中任何两个用户通过话; (2)G是团体,即,如再加一个G外的人进去,所得新群体是不满足条件(1)的。 任务:计算出这公司的所有用户构成的群体中最大团体的用户数。最大团体是所有团体中用户数最多的团体,可能不止一个,但所有最大团体中用户数是一样的。 输入: 输入有若干组测试数据,每组测试数据的第一行上有一个整数n,(1<=n<=50),是通讯公司的用户数。接下来的n行是这n个人的通讯状况,其第i行是0、1序列,长为n,序列之间无空格。该行第j个位置的数如为1表示i与j通过电话;如为0则表示未通过话。相邻两组测试之间无空行。输入直到文件结束。 输出: 对输入中的每组测试数据,在输出文件中输出对应的最大团体的用户数m。对第i组测试数据,先在一行上输出“Case i:”,接着输出m,见样例。 输入样例: 5 01011 10101 01001 10001 11110 输出样例: Case 1: 3 分析 本题要确定最大团体人员数,基本的思想是从第一个人开始考察他是否在最大团体中。如前面的i-1人已被考察过,且前面的i-1人中已有cnt人构成一个团,现考察第i人能否在该团中。继续这个工作,直到所有人都被考察一遍。 用深度优先回溯方法。 #include<iostream> using namespace std; const int MAXN=100; int x[MAXN],bestx[MAXN], n, a[MAXN][MAXN], bestn,cn; void backtrack(int i) { if (i > n-1) { // 到达叶结点 for (int j = 0; j < n; j++) bestx[j] = x[j]; bestn = cn; return; } // 检查顶点 i 与当前团的连接 int ok = 1; for (int j =0; j < i; j++) if ((x[j] == 1) && (!a[i][j]) ) { //考察: i与前面的j是否相连 ok = 0; break; } // i与前面的j不相连,舍弃i if (ok){ // 进入左子树 x[i] = 1; cn++; backtrack(i + 1); cn--; } if (cn + n - i > bestn){ // 进入右子树 x[i] = 0; backtrack(i + 1); } return ; } int main(){ int i,j,num=0; char c[MAXN][MAXN]; while (cin>>n) { //团体大小n bestn=0; cn=0; num++; cin.get(); for(i=0;i<n;i++) //输入团体中人员的关系信息 cin.getline(c[i], MAXN); for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=c[i][j]-48; //转换为邻接矩阵 backtrack(0); //回溯法搜索 cout<<"Case "<<num<<": "<<bestn<<endl; } return 0; } 3、缘份 问题描述:给出n个男女生之间的缘分值,按一定的规则对男女生配对,求所有配对男女生间的男女缘分和的最大值。规则是:每一个男生只可选择一位女生,两

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档