#define MaxVertexNum 100;
typedef char VettexType;
typedef int EdgeType;
typedef struct{
VextexType vex[MaxVertexNum];顶点表
EdgeType edge[MaxVertexNum][MaxVertexNum];边表
int vexum,arcnum;
}MGraph
#define MaxVertexNum 100;
typedef struct ArcNode{
int adjvex;
struct ArcNode* next;
};
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}Adjlist[MaxVertexNum];
typedef struct{
Adjlist adjlist[MaxvertexNum];
int vexnum,arcnum;
}ALGraph
- 图的广度优先遍历BFS
- 从任意顶点v出发,然后访问与其邻接的所有顶点(w1,w2…wn),最后再对(w1,w2…wn)的邻接顶点进行访问
void BFSTraverse(ALGraph G){
for(int i=0;i<G.vexnum;i++){
visited[i]=false;
}
InitQueue(Q);
for(int i=0;i<G.vexnum;i++){
if(visited[i]==fasle)
BFS(G,i);
}
}
void BFS(ALGraph G,int v){
visit(v);
visited[v]=true;
EnQueue(Q,v);
ArcNode *p;
while(Queue(Q)!=NULL){
DeQueue(Q,v);
p=G.adjlist[v].firstarc;
while(p!=NULL){
if(visited[p->dajvex]==false){
visit(p->dajvex);
visited[p->dajvex]=true;
EnQueue(Q,p->adjvex);
}
p=p->next;
}
}
}
- 图的深度优先遍历DFS
- 先访问顶点v,然后再访问与顶点v邻接的顶点w,再访问与顶点w邻接的顶点p
void DFSTraverse(ALGraph G){
for(v=0;v<vexnum;v++){
visited[v]=false;
}
for(v=0;v<G.vexnum;v++){
if(visited[v]==false)
DFS(G,v);
}
}
void DFS(ALGraph G,int v){
ArcNode *p;
visit(v);
visited[v]=true;
p=G.adjlist[v].firstarc;
while(p!=NULL){
if(visited[p->adjvex]==false){
DFS(G,P->adjvex)
}
p=p->next;
}
}
bool TopoLogicalSort(ALGraph G){
InitStack(S);
ArcNode *p;
for(int i=0;i<G.vexnum;i++){
if(indegree[i]==0) push(S,i);
}
int count=0;
while(StackEmpty(s)!=NULL){
pop(S,i);
print(G.adjlist[i].data);
count++;
for(p=G.adjlist[i].firstarc;p;p=p->next){
v=p->adjvex;
indegree[v]--;
if(indegree[v]==0) push(s,v);
}
}
if(count<G.vexnum) return false;
else return true;
}
- 设计一个算法,求不带权无向连通图G中距顶点v最远的顶点
void GetMaxDistance(AlGraph G,int v){
ArcNode *p;
VertexType temp;
InitQueue(Q);
visited[v]=true;
EnQueue(Q,v);
while(QueueEmpty(Q)!=NULL){
DeQueue(Q,v);
temp=v->data;
p=G.adjlist[v].firstarc;
while(p!=NULL){
if(visited[p->dajvex]==false){
visited[p->adjvex]=true;
EnQueue(Q,p->adjvex);
}
p=p->next;
}
}
print(temp);
}
- 在有向图G中,从顶点r到图G的每个顶点的路径都可达,则称顶点r为G的根结点。求存于邻接表G中的图的所有顶点
int sum=0;
void DFS(AlGraph G,int v){
ArcNode *p;
sum++;
visited[v]=true;
p=G.adjlist[v].firstarc;
while(p!=NULL){
if(visited[p->adjvex]==false){
DFS(G,P->adjvex);
}
p=p->next;
}
}
void GetVertex(AlGraph G){
for(int i=0;i<G.vexnum;i++){
DFS(G,i);
if(sum==G.vexnum) print(G.adjlist[i].data);
}
}
void Convert(AlGraph &G,int edge[m][n]){
for(int j=0;j<G.vexnum;j++){
for(int k=0;k<G.vexnum;k++)
edge[j][k]=0;
}
for(int i=0;i<G.vexnum;i++){
p=G.adjlist[i].firstarc;
while(p!=NULL){
adjlist[i][p->adjvex]=1;
p=p->next;
}
}
}
void Convert(AlGraph &G,int edge[n][n]){
for(int i=0;i<G.vexnum;i++){
G.adglist[i].firstarc=NULL;
}
for(int j=0;j<G.vexnum;j++){
for(k=0;k<G.vexnum;k++){
if(edge[j][k]==1){
ArcNode *p=(ArcNode *)malloc(sizeof(LNode));
p->adjvex=k;
p->next=G.adjlist[i].firstarc;
G->adjlist[i].firstarc=p;
}
}
}
}
- 写一个算法对有n个顶点邻接表存储的有向图,求顶点k的入度
int count(AlGraph G,int k){
ArcNode *p;
int sum=0;
for(int i=0;i<G.vexnum;i++){
p=G.adjlist[i].firstarc;
while(p!=NULL){
if(p->adjvex==k){
sum++;
break;
}
p=p->next;
}
}
return sum;
}