“六度空间”理论又称做“六度分隔(Six Degrees of Separation)”理论。这个理论能够通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多经过五我的你就可以认识任何一个陌生人。”如图1所示。 “六度空间”理论虽然获得普遍的认同,而且正在获得愈来愈多的应用。可是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而因为历史的缘由,这样的研究具备太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通讯等工具,可以体现社交网络关系的一手数据已经逐渐使得“六度空间”理论的验证成为可能。 假如给你一个社交网络图,请你对每一个节点计算符合“六度空间”理论的结点占结点总数的百分比。
宏定义邻接矩阵g[10001][10001],顶点数v,边数e,循环变量i,中间变量x,y用来输入 main函数 定义浮点型数据 n,m来求最后所占比率 输入顶点数v和边数e while e-- //构建邻接矩阵 输入边关系 x y g[x][y] = g[y][x] = 1 end while for i=1 to v do n=v m=bfs(i) //调用bfs函数 end for return 0 int bfs(int z) 定义数组vis[10001]=0 表示是否被访问过的结点 定义 last = z表示记录每层的最后一个元素 i定义tail表示用于记录每一层压入栈时的结点 定义 level = 0 表示与该结点距离是否为6 定义count=1//表示结点 建立int型栈q并入栈z 将vis[z]置为1表示访问过了 while q不为空 z = q.front()//取栈顶元素于z q.pop()//去栈顶 for i = 1to v do //广度遍历方法 if g[z][i] 等于1 而且 vis[i]等于 0 then count++; vis[i] = 1; q.push(i); tail = i; end if end for if last 等于z then//一层所有从栈弹出,准备开始弹下一层,弹出的数等于当前层最后一个元素,并记录与last level++; last = tail;//记录最后一个元素 end if if level 等于 6 break //符合题意的路径节点 return count
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每一个村落都有公路连通所须要的最低成本。
宏定义无穷大INF为32767 及 MAXV 为1001 宏定义邻接矩阵 g[MAXV][MAXV]以及数组 visited[MAXV]={0}; 定义 count 为1来判断是否为符合要求 int main() { 定义 i,n,e分别表示循环变量、顶点数、边数 定义浮点型数据 sum为成本 输入 n,e //顶点数 边数 if n-1大于e then //不符合的状况 输出-1 return 0 end if CreateGraph(n, e)//建图函数 sum=Prim(n,1)//计算最低成本 调用prim函数 if count==n then 输出sum else 输出-1 end if return 0 } void CreateGraph(int n, int e) //建立邻接矩阵 { 定义 i,j,a, b, c; for i = 0 to n; do//初始化 for j = 0 to n do g[i][j]==0 end for end for for i = 1 to e do 输入 a,b,c g[a][b] =g[b][a]= c; end for } int Prim(int n, int v) { 定义 数组 lowcost[MAXV],close[MAXV], cost = 0表示最低成本, i, j表示循环变量 min为最低的费用,index用来存下标 for i = 1 to n //给lowcost数组和close数组置初值 lowcost[i] = g[v][i]; close[i] = v; end for for i = 1 to n do min = INF 定义 flag=0//用来判断这一层是否有最低费用 for j = 1to n //从剩下的城市中找最近的点 if lowcost[j] 不等于 0且lowcost[j] 小于 min) then //计算费用最低 min = lowcost[j]; index = j; flag=1; end if end for if flag不为0 then //该层有最低费用 cost += min; count++; end if lowcost[index] = 0; for j=1to n do //进行调整 if lowcost[j] 不等于 0且g[index][j]小于lowcost[j then//修改数组的值 lowcost[j] = g[index][j]; close[j] = index; end if end for end for return cost; }
图着色问题是一个著名的NP彻底问题。给定无向图G=(V,E),问能否用K种颜色为V中的每个顶点分配一种颜色,使得不会有两个相邻顶点具备同一种颜色? 但本题并非要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是不是图着色问题的一个解。
宏定义数组 visited[501]={0},d[501],k=0 宏定义邻接矩阵a[501][501]及循环变量与一些变量:v,e,z,x,y,i,j,n; void dfs(int i) { 定义 j; d[k++]=i; visited[i]=1; forj=1to v do if(a[i][j]等于1 而且 visited[j]等于0 then dfs(j); end if end for } void dfs1() { 定义 i; for i=1 to v if visited[i]等于0 then dfs(i); //没被访问过 end for } int main() { 输入v、e、z; for i=0 to e 输入变关系x、y; a[x][y]=a[y][x]=1; end for dfs1(); 输入n; while n-- 初始化 b[501]={0},c[501],e[501],sum=0,flag=1; for i=1 to v;i++) 输入c[i]; b[c[i]]++; if b[c[i]]等于1 then sum++; end for if sum不等于z then flag=0; end if for i=0 to k do e[i]=c[d[i]] end for for i=0 to k forj=0 to k if a[d[i]][d[j]]等于1而且e[i]等于e[j] then flag=0; break; end if if flag等于0 then break; end for if flag等于0 输出No else 输出Yes end if end while return 0 }
错误
算法
深度遍历时候,指针指向下一个的时候,考试时候想错了,而后放在了若是没被遍历过的if语句中,致使超时,将语句放在if语句外就能够了
错误
数组
改正微信
多是考试时候打得太快了...把大写G写成了小写g,while也写错了,写成了whlie...
错误
网络
忘记用tail记录下每行的最后一个没被遍历的数,还有当时看题目搞错题目意思了,觉得少于6是当等于7时候退出循环,主要是考试前特别慌这最后一场考试,常常去写去看这些pta代码,基本到最后都快能背下来了,连变量名都没换
错误
函数
忘记考虑了另外就是当数目不对时候也是不符合的状况,也要输出-1,还有就是以前很差理解的将最后一个没被遍历的那一行的首个置为0,在考试时候仍是没注意到,又忘记了,最后仍是没时间就没去细想了