1、我们用l代表最长平台的长度,用k指示最长平台在数组b中的起始位置(下标)。用j记住局部平台的起始位置,用i指示扫描b数组的下标,i从0开始,依次和后续元素比较,若局部平台长度(i-j)大于l时,则修改最长平台的长度k(l=i-j)和其在b中的起始位置(k=j),直到b数组结束,l即为所求。voidPlatform(intb[],intN
//求具有N个元素的整型数组b中最长平台的长度。{l=1;k=0;j=0;i=0;while(i
{while(i
if(i-j+1>l{l=i-j+1;k=j;}//局部最长平台i++;j=i;}//新平台起点
printf(“最长平台长度%d,在b数组中起始下标为%d”,l,k;}//Platform2、连通图的生成树包括图中的全部n个顶点和足以使图连通的n-1条边,最小生成树是边上权值之和最小的生成树。故可按权值从大到小对边进行排序,然后从大到小将边删除。每删除一条当前权值最大的边后,就去测试图是否仍连通,若不再连通,则将该边恢复。若仍连通,继续向下删;直到剩n-1条边为止。voidSpnTree(AdjListg
//用“破圈法”求解带权连通无向图的一棵最小代价生成树。
{typedefstruct{inti,j,w}node;//设顶点信息就是顶点编号,权是整型数nodeedge[];
scanf("%d%d",&e,&n;//输入边数和顶点数。
for(i=1;i<=e;i++//输入e条边:顶点,权值。
scanf("%d%d%d",&edge[i].i,&edge[i].j,&edge[i].w;
for(i=2;i<=e;i++//按边上的权值大小,对边进行逆序排序。{edge[0]=edge[i];j=i-1;
while(edge[j].wedge[j+1]=edge[0];}//fork=1;eg=e;
while(eg>=n//破圈,直到边数e=n-1.
{if(connect(k//删除第k条边若仍连通。
{edge[k].w=0;eg--;}//测试下一条边edge[k],权值置0表示该边被删除k++;//下条边}//while}//算法结束。
connect(是测试图是否连通的函数,可用图的遍历实现,3、假设以邻接矩阵作为图的存储结构,编写算法判别在给定的有向图中是否存在一个简单有向回路,若存在,则以顶点序列的方式输出该回路(找到一条即可)。(注:图中不存在顶点到自己的弧)
有向图判断回路要比无向图复杂。利用深度优先遍历,将顶点分成三类:未访问;已访问但其邻接点未访问完;已访问且其邻接点已访问完。下面用0,1,2表示这三种状态。前面已提到,若dfs(v)结束前出现顶点u到v的回边,则图中必有包含顶点v和u的回路。对应程
序中v的状态为1,而u是正访问的顶点,若我们找出u的下一邻接点的状态为1,就可以输出回路了。
voidPrint(intv,intstart//输出从顶点start开始的回路。{for(i=1;i<=n;i++
if(g[v][i]!=0&&visited[i]==1//若存在边(v,i),且顶点i的状态为1。{printf(“%d”,v;
if(i==startprintf(“\n”;elsePrint(i,start;break;}//if}//Printvoiddfs(intv{visited[v]=1;for(j=1;j<=n;j++
if(g[v][j]!=0//存在边(v,j
if(visited[j]!=1{if(!visited[j]dfs(j;}//ifelse{cycle=1;Print(j,j;}visited[v]=2;}//dfs
voidfind_cycle(//判断是否有回路,有则输出邻接矩阵。visited数组为全局变量。{for(i=1;i<=n;i++visited[i]=0;
for(i=1;i<=n;i++if(!visited[i]dfs(i;}//find_cycle
4、请编写一个判别给定二叉树是否为二叉排序树的算法,设二叉树用llink-rlink法存储。5、二部图(bipartitegraph)G=(V