東北林業大學銳格測試題(圖)
阿新 • • 發佈:2020-12-15
圖
1、鍵盤輸入資料,建立一個有向圖的鄰接表。
2、在有向圖的鄰接表的基礎上計算各頂點的度,並輸出。
3、以有向圖的鄰接表為基礎實現輸出它的拓撲排序序列。
4、採用鄰接表儲存實現無向圖的深度優先遍歷。
5、採用鄰接表儲存實現無向圖的廣度優先遍歷。
1、鍵盤輸入資料,建立一個有向圖的鄰接表。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define MAX_VERTEXT_NUM 20
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
int data;
ArcNode *firstarc;
}VNode;
typedef struct ALgraph
{
VNode AdjList[MAX_VERTEXT_NUM];
int vexnum,arcnum;
}ALGraph;
void creatArc(ALGraph &G)
{ int from;
int to;
int i;
scanf("%d %d" ,&G.vexnum,&G.arcnum);
for(i=1;i<=G.vexnum;i++)
{ cin>>G.AdjList[i].data;
G.AdjList[i].firstarc=NULL;
}
for(i=1;i<=G.arcnum;i++)
{
scanf("%d %d",&from,&to);
ArcNode *s=new ArcNode;
s->adjvex=to;
s->nextarc=G.AdjList[ from].firstarc;
G.AdjList[from].firstarc=s;
}
}
2、在有向圖的鄰接表的基礎上計算各頂點的度,並輸出。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define MAX_VERTEXT_NUM 20
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
int data;
ArcNode *firstarc;
}VNode;
typedef struct ALgraph
{
VNode AdjList[MAX_VERTEXT_NUM];
int vexnum,arcnum;
}ALGraph;
int IN[MAX_VERTEXT_NUM]={0};
int OUT[MAX_VERTEXT_NUM]={0};
void creatArc(ALGraph &G)
{ int from;
int to;
int i;
scanf("%d %d",&G.vexnum,&G.arcnum);
for(i=1;i<=G.vexnum;i++)
{ cin>>G.AdjList[i].data;
G.AdjList[i].firstarc=NULL;
}
for(i=1;i<=G.arcnum;i++)
{
scanf("%d %d",&from,&to);
OUT[from]++;
IN[to]++;
ArcNode *s=new ArcNode;
s->adjvex=to;
s->nextarc=G.AdjList[from].firstarc;
G.AdjList[from].firstarc=s;
}
}
void Print(ALGraph &G)
{
for(int i=1;i<=G.vexnum; i++)
{
cout << G.AdjList[i].data << ':';
cout << IN[i] <<" "<<OUT[i]<<" "<<IN[i]+OUT[i]<< ' ';
cout << endl;
}
}
int main()
{ ALGraph G;
int i;
creatArc(G);
Print(G);
return 0;
}
3、以有向圖的鄰接表為基礎實現輸出它的拓撲排序序列。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define MAX_VERTEXT_NUM 20
#define MVNum 100//最大頂點數
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
int data;
ArcNode *firstarc;
}ANode;
typedef struct
{
VNode AdjList[MAX_VERTEXT_NUM];
int vexnum,arcnum;
}ALGraph;
int IN[MVNum]={0};
int OUT[MVNum]={0};
int visited[MAX_VERTEXT_NUM];
void creatArc(ALGraph &G)
{ int from;
int to;
int i;
scanf("%d %d",&G.vexnum,&G.arcnum);
for(i=1;i<=G.vexnum;i++)
{ cin>>G.AdjList[i].data;
G.AdjList[i].firstarc=NULL;
}
for(i=1;i<=G.arcnum;i++)
{
scanf("%d %d",&from,&to);
ArcNode *s=new ArcNode;
OUT[from]++;
IN[to]++;
s->adjvex=to;
s->nextarc=G.AdjList[from].firstarc;
G.AdjList[from].firstarc=s;
}
}
void TOPSORT(ALGraph G)
{ int i,j,n=0;
int Stack[MVNum],top=-1;
ArcNode *p;
for(i=1;i<=G.vexnum;i++)
{
if(IN[i]==0)
{
Stack[++top]=i;
}
}
while(top!=-1)
{
i=Stack[top--];
n++;
cout<<"v"<<i<<" ";
p=new ArcNode;
p=G.AdjList[i].firstarc;
while(p!=NULL)
{
j=p->adjvex;
IN[j]--;
if(IN[j]==0)
{
Stack[++top]=j;
}
p=p->nextarc;
}
}
}
int main()
{
ALGraph G;
creatArc(G);
TOPSORT(G);
return 0;
}
4、採用鄰接表儲存實現無向圖的深度優先遍歷。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define MAX_VERTEXT_NUM 20
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
int data;
ArcNode *firstarc;
}ANode;
typedef struct
{
VNode AdjList[MAX_VERTEXT_NUM];
int vexnum,arcnum;
}ALGraph;
int visited[MAX_VERTEXT_NUM];
void creatArc(ALGraph &G)
{ int from;
int to;
int i;
scanf("%d %d",&G.vexnum,&G.arcnum);
for(i=1;i<=G.vexnum;i++)
{ cin>>G.AdjList[i].data;
G.AdjList[i].firstarc=NULL;
}
for(i=1;i<=G.arcnum;i++)
{
scanf("%d %d",&from,&to);
ArcNode *s1,*s;s=new ArcNode;s1=new ArcNode;
s->adjvex=to;
s->nextarc=G.AdjList[from].firstarc;
G.AdjList[from].firstarc=s;
s1->adjvex=from;
s1->nextarc=G.AdjList[to].firstarc;
G.AdjList[to].firstarc=s1;
}
}
void DFS(ALGraph G,int v)
{
cout<<"v"<<v<<" ";
visited[v]=1;
ArcNode *p=G.AdjList[v].firstarc;
while(p!=NULL)
{ int w=p->adjvex;
if(!visited[w])
DFS(G,w);
p=p->nextarc;
}
}
void DFSTraversse(ALGraph G)
{ int v;
for(v=1;v<=G.vexnum;v++)
{
visited[v]=0;
}
for(v=1;v<=G.vexnum;v++)
{
if(!visited[v])
DFS(G,v);
}
}
int main()
{
ALGraph G;
creatArc(G);
DFSTraversse(G);
return 0;
}
5、採用鄰接表儲存實現無向圖的廣度優先遍歷。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define MAX_VERTEXT_NUM 20
#define MVNum 100//最大頂點數
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
int data;
ArcNode *firstarc;
}ANode;
typedef struct
{
VNode AdjList[MAX_VERTEXT_NUM];
int vexnum,arcnum;
}ALGraph;
int visited[MAX_VERTEXT_NUM];
void creatArc(ALGraph &G)
{ int from;
int to;
int i;
scanf("%d %d",&G.vexnum,&G.arcnum);
for(i=1;i<=G.vexnum;i++)
{ cin>>G.AdjList[i].data;
G.AdjList[i].firstarc=NULL;
}
for(i=1;i<=G.arcnum;i++)
{
scanf("%d %d",&from,&to);
ArcNode *s1,*s;s=new ArcNode;s1=new ArcNode;
s->adjvex=to;
s->nextarc=G.AdjList[from].firstarc;
G.AdjList[from].firstarc=s;
s1->adjvex=from;
s1->nextarc=G.AdjList[to].firstarc;
G.AdjList[to].firstarc=s1;
}
}
int visit[MVNum];
void DFS(ALGraph G,int v)
{
cout<<"v"<<v<<" ";//訪問第v個頂點
visit[v]=1;
int Front=0,Rear=0,j;
ArcNode *p;
p=new ArcNode;
int que[MVNum];
Rear=(Rear+1)%MVNum;
que[Rear]=v;
while(Front!=Rear)
{
Front=(Front+1)%MVNum;
j=que[Front];
p=G.AdjList[j].firstarc;
while(p!=NULL)
{
if(visit[p->adjvex]==0)
{
cout<<"v"<<p->adjvex<<" ";
visit[p->adjvex]=1;
Rear=(Rear+1)%MVNum;
que[Rear]=p->adjvex;
}
p=p->nextarc;
}
}
}
void DFSTraversse(ALGraph G)
{ int v;
for(v=1;v<=G.vexnum;v++)
{
visit[v]=0;
}
for(v=1;v<=G.vexnum;v++)
{
if(!visit[v])
DFS(G,v);
}
}
int main()
{
ALGraph G;
creatArc(G);
DFSTraversse(G);
return 0;
}