社会网络分析系统的设计和实现数据结构课程设计(编辑修改稿)内容摘要:

texnum。 i++)//计算每个顶点的出度 for( j=0。 jvertexnum。 j++) y[i]+=arc[i][j]。 //y[i]存放出度数 cout— →活跃人物是:。 int yu=10。 //找度数大于域值的人物 , 域 =10 for (i=0。 ivertexnum。 i++) { if(y[i]yu) { coutvertex[i]。 count++。 } } if(count==0) {cout无。 } coutendl。 } //———————— bianyuan 边缘人物 ———————— 若人物收到 和发出的 Email 总数小于 5 封,我认为就是边缘人物,所以我设置了域为 5, bianyuan 函数要完成的功能是找入度与出度之和小于域值的人物,并输出。 9 templateclass T void MgraphT::bianyuan(int n) { vertexnum=n。 int i,j,count=0。 int z[maxsize]={0}。 for(i=0。 ivertexnum。 i++)//计算每个顶点的度数 for(j=0。 jvertexnum。 j++) z[i]=z[i]+arc[i][j]+arc[j][i]。 //z[i]存放入度 +出度之和 cout— →边缘人物是:。 int yu=5。 //找度数小于域值的人物 , 域 =5 for (i=0。 ivertexnum。 i++) { if(z[i]yu) { coutvertex[i]。 count++。 } } if(count==0) {cout无。 } coutendl。 } //———————— quanzi 查找交往圈子 ———————— 根据用户输入的一个人员的数字代码,查找该人员的交往圈子,我认为与指定人物之间有边的人物就是与该人物有联系的,这些人就构成了一个交往圈子。 template class T void MgraphT::quanzi(int v) { int count=0。 cout— → vertex[v1]的交往圈子是 :。 for (int j=0。 jvertexnum。 j++) { if (arc[v1][j]!=INFINITY||arc[j][v1]!=INFINITY) //交往圈子:与指定人物之间有边就算 { coutvertex[j]。 count++。 } } if(count==0) {cout无。 } coutendl。 } //—————— ADD 计算人员间两两间联系数 ———————— 计算指定人员两两间的联系数并返回(为查找小团体、桥接人做准备) template class T int MgraphT::ADD(int s,int t) { int temp。 if(st) { temp=s。 s=t。 t=temp。 } 10 else return (arc[s][t]+arc[t][s])。 } //————— BY 查找小团体中用来判断边缘人物 —————— 找边缘人物并返回该人物数字代码(为查找小团体、桥接人做准备) templateclass T int MgraphT::BY(int n) { int i,j,count=0。 int z[maxsize]={0}。 for(i=0。 in。 i++)//计算每个顶点的度数 for(j=0。 jn。 j++) z[i]=z[i]+arc[i][j]+arc[j][i]。 //z[i]存放入度 +出度之和 int yu=5。 // 域 =5 for (i=0。 in。 i++) { if(z[i]yu) { return(i)。 count++。 } } if(count==0) return(99)。 } //———————— DFS 查找小团体 ———————— 查找小团体,从指定的顶点(我设置的是 0 也就是第一个人)开 始进行深度优先遍历(如果当前人物 A 没有被访问过,并且也不是边缘人物,输出该人物 A;再从该人物 A 开始进行深度遍历,如果找到与该人物交往密切的人物 B 则输出,再从 B 开始继续找下一个),并且在查找过程中输出小团体成员。 template class T void MgraphT::DFS(int v,int n) //v 控制递归 n 为总人数 { if (v==0)//如果是第一次使用 { for (int k=0。 kn。 k++) visited[k]=0。 //初始化顶点标记矩 阵(全部置 0 代表没有访问过) DFS(v+1,n)。 //利用递归算法重复调用深度优先遍历 DFS } else { if (visited[v1]==0)//如果当前人物没有被访问过 { if(v1!=BY(n))//并且也不是边缘人物 { int yu=10。 //域值 11 coutvertex[v1]。 //输出该结点的值 visited[v1]=1。 //将该结点置为访问过。 for (int k=0。 kn。 k++) { if (ADD(v1,k)yu)//如果两个结点之间交往 密切 { DFS(k+1,n)。 }//找下一个 } cout,。 DFS(v+1,n)。 } else DFS(v+1,n)。 } } } //———————— DFS2 查找桥接人 ———————— 查找桥接人,两个小团体中,有联系,但没有达到域值的人物。 从指定的顶点开始进行深度优先遍历 template class T void MgraphT::DFS2(int v,int n) //v 控制递归 n 为总人数 { int yu=10。 //域值 for (int k=v1。 kn。 k++) { if (ADD(v1,k)0 amp。 amp。 ADD(v1,k)yu amp。 amp。 v1!=BY(n)amp。 amp。 k!=BY(n))//如果两个结点之间有边但交往不密切,并且分别属于两个小团体 { coutvertex[v1] vertex[k]。 //输出桥接人结点的值 DFS2(k+1,n)。 //找下一个 } } if (v=n) DFS2(v+1,n)。 } //———————— 主函数 ———————— 测试刚刚的 Mgraph 类中的各种成员函数是否编写正确,完成要求的功能。 void main() { cout| 欢迎使用社会网络分析系统 |endl。 int n,e,m。 //n 总人数, e 总关系数, m 某个人员的数字代码 cout请输入该社会网络总人数:。 cinn。 12 char *a=new char[n]。 //a 是指针, a 的值是新建数组的首地址, a[0],a[1]等 cout请依次输入人员名称:。 for(int i=0。 in。 i++) {cina[i]。 } cout请输入该社会网络的关系总数:。 cine。 Mgraphchar G(a,n,e)。 cout以下是该社会网络对应的邻接矩阵: endl。 ()。 cout******************社会网络分析中 ******************: endl。 (n)。 (n)。 (n)。 cout— →小团体是:。 (0,n)。 coutendl。 cout— →联系小团体的桥接人物是:。 (1,n)。 coutendl。 cout请输入一个人员的数字代码(用于查找该人员的交往圈子):。 cinm。 (m)。 } 五、调试分析 (包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经验体会)  问题 amp。 改进 amp。 补充: 【问题 1】:小团体和桥接人的理解与定义 小团体:小团体就是由交往比较密切的一群人构成的,因此要设一个域值, 数据(权值)超过这个域值才能算交往密切;一个人不能单独构成一个小团体,小团体至少要 2 个成员组成。 桥接人:桥接人就是联系两个小团体的中间人,也就是说一个小团体可以通过对应的桥接人和另外一个小团体取得联系,桥接人分属于两个不同的团体。 【问题 2】:参数传递问题 目的是 在一个成员函数里调用另一个成员。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。