目录
一、函数题
1.邻接矩阵存储图的深度优先遍历
2.邻接表存储图的广度优先遍历
二、编程题
1.最大子列和问题
试实现邻接矩阵存储图的深度优先遍历。
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );
其中MGraph
是邻接矩阵存储的图,定义如下:
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv; /* 顶点数 */
int Ne; /* 边数 */
WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
函数DFS
应从第V
个顶点出发递归地深度优先遍历图Graph
,遍历时用裁判定义的函数Visit
访问每个顶点。当访问邻接点时,要求按序号递增的顺序。题目保证V
是图中的合法顶点。
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) )
{
Visited[V]=true;
Visit(V);
for(Vertex i=0;iNv;i++)
if(Graph->G[V][i]==1&&!Visited[i])
DFS(Graph,i,Visit);
}
试实现邻接表存储图的广度优先遍历。
void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) );
其中LGraph
是邻接表存储的图,定义如下:
/* 邻接点的定义 */
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{
Vertex AdjV; /* 邻接点下标 */
PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */
};
/* 顶点表头结点的定义 */
typedef struct Vnode{
PtrToAdjVNode FirstEdge; /* 边表头指针 */
} AdjList[MaxVertexNum]; /* AdjList是邻接表类型 */
/* 图结点的定义 */
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv; /* 顶点数 */
int Ne; /* 边数 */
AdjList G; /* 邻接表 */
};
typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */
函数BFS
应从第S
个顶点出发对邻接表存储的图Graph
进行广度优先搜索,遍历时用裁判定义的函数Visit
访问每个顶点。当访问邻接点时,要求按邻接表顺序访问。题目保证S
是图中的合法顶点。
void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) )
{
int queue[1000],l=0,r=0;
queue[r++]=S;
Visited[S]=true;
Visit(S);
while(l!=r)
{
PtrToAdjVNode t=Graph->G[queue[l++]].FirstEdge;
while(t)
{
int x=t->AdjV;
if(!Visited[x])
{
Visited[x]=true;
Visit(x);
queue[r++]=x;
}
t=t->Next;
}
}
}
给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。
本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:
输入第1行给出正整数K (≤100000);第2行给出K个整数,其间以空格分隔。
在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。
#include
using namespace std;
const int N=1e5+10;
int a[N];
int main()
{
int n;cin>>n;
for(int i=0;i>a[i];
int ma=max(0,a[0]),sum=ma;
for(int i=1;ima)ma=sum;
if(sum<0)sum=0;
}
cout<