데이터 구조 실험 4 도 에 관 한 조작
목적 요구:
1. 그림 의 저장 사상 과 저장 실현 을 파악 한다.
2. 그림 의 깊이, 넓이 를 파악 하여 알고리즘 사상 과 절 차 를 우선 적 으로 옮 겨 다 닌 다.
3. 그림 에서 흔히 볼 수 있 는 응용 알고리즘 의 사상 과 절차 실현 을 파악 한다.
실험 내용:
1. 키보드 가 데 이 터 를 입력 하고 그림 에 대한 인접 표를 만 듭 니 다.
2. 이 인접 표를 출력 합 니 다.
*3. 그림 이 없 는 십자 링크 를 만 듭 니 다.
4. 그림 의 인접 표를 바탕 으로 각 정점 의 도 를 계산 하고 출력 한다.
5. 그림 에 대한 인접 표를 바탕 으로 토폴로지 정렬 순 서 를 출력 합 니 다.
*6. 인접 행렬 로 방향 도 를 저장 하고 출력 단일 원점 에서 다른 정점 까지 의 가장 짧 은 경 로 를 저장 합 니 다.
7. 인접 표 저장 소 를 이용 하여 무 방향 그림 의 깊이 를 우선 시 하고 재 귀적 으로 옮 겨 다 니 지 않 습 니 다.
8. 인접 표 저장 소 를 이용 하여 무방 향도 의 넓이 를 우선적으로 옮 겨 다 닌 다.
*9. 인접 행렬 저장 소 를 이용 하여 무방 향도 의 최소 생 성 트 리 를 구현 하 는 PRIM 알고리즘.
*10. 그림 의 임의의 두 정점 사이 에 경로 가 있 는 지 판단 하고 출력 경로 의 정점 서열 이 있 으 면 판단 한다.
11. 주 함수 에서 간단 한 메뉴 를 설계 하여 상기 알고리즘 을 각각 디 버 깅 합 니 다.
*12. 종합 훈련: 컴퓨터 학과 의 교육 계획 을 설계 하기 위해 4 학년, 학년 마다 2 학기, 50 개의 과정 을 개설 하고 매 학기 에 개설 하 는 과정 문 수 는 최대한 균형 을 이 루 며 과정의 배정 은 반드시 선행 관 계 를 만족 시 켜 야 한다.
코드 구현:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define Maxsize 200
using namespace std;
int indegree[Maxsize],outdegree[Maxsize];
typedef char InfoType;///
typedef char VertexType; ///
typedef struct ArcNode ///
{
int adjvex; ///
struct ArcNode *nextarc;///
InfoType *info;///
} ArcNode;
typedef struct VNode ///
{
VertexType data;
ArcNode *firstarc;
} VNode,AdjList[Maxsize];
typedef struct ///
{
AdjList vertices;
int vexnum,arcnum;///
int kind; ///kind==0 ,kind==1
} ALGraph;
int visited[Maxsize];
void Create(ALGraph &G)
{
char ch1,ch2;
int k1,k2;
printf("Please Input the Vexnum & Arcnum:
");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("Please Input the Vexnums:
");
for(int i=1; i<=G.vexnum; i++) /// 1
{
scanf(" %c",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
}
printf("Please Input the Arcnums:
");
for(int i=1; i<=G.arcnum; i++)
{
scanf(" %c %c",&ch1,&ch2);
for(int p=1; p<=G.arcnum; p++)
{
if(G.vertices[p].data==ch1)
{
k1=p;
break;
}
}
for(int p=1; p<=G.arcnum; p++)
{
if(G.vertices[p].data==ch2)
{
k2=p;
break;
}
}
ArcNode *pp;/// , ,
pp=(ArcNode*)malloc(sizeof(ArcNode));
pp->adjvex=k2;
pp->nextarc=G.vertices[k1].firstarc;
G.vertices[k1].firstarc=pp;
}
}
void Dfs(ALGraph G,VertexType x)/// , x
{
//ALGraph G=GG;
int k1;
for(int i=1; i<=G.vexnum; i++)
{
if(G.vertices[i].data==x)
{
k1=i;
break;
}
}
printf("%c ",G.vertices[k1].data);
visited[k1]=1;
ArcNode *p;
p=G.vertices[k1].firstarc;
while(p)///
{
if(visited[p->adjvex]==0) ///
{
Dfs(G,G.vertices[p->adjvex].data); ///
}
p=p->nextarc;/// , , p
}
}
void Bfs(ALGraph G,VertexType x)/// G
{
struct
{
ArcNode *Q[Maxsize];
int front,rear;
} QQ; ///
ArcNode *p;
QQ.front=QQ.rear=0;///
int k1;
for(int i=1; i<=G.vexnum; i++)
{
if(G.vertices[i].data==x) /// x , k1
{
k1=i;
break;
}
}
visited[k1]=1;
printf("%c ",G.vertices[k1].data);
QQ.rear=(QQ.rear+1)%Maxsize;
QQ.Q[QQ.rear]=G.vertices[k1].firstarc;
while(QQ.rear!=QQ.front)
{
QQ.front=(QQ.front+1)%Maxsize;
p=QQ.Q[QQ.front];
while(p)
{
if(visited[p->adjvex]==0)///visited[] ,
{
visited[p->adjvex]=1;
printf("%c ",G.vertices[p->adjvex].data);
QQ.rear=(QQ.rear+1)%Maxsize;
QQ.Q[QQ.rear]=G.vertices[p->adjvex].firstarc;
}
p=p->nextarc;
}
}
}
void Output(ALGraph G)
{
for(int i=1; i<=G.vexnum; i++)
{
printf("%c ",G.vertices[i].data);
ArcNode *pp;
pp=G.vertices[i].firstarc;
while(pp)
{
printf("%c ",G.vertices[pp->adjvex].data);
pp=pp->nextarc;
}
printf("
");
}
}
void Degree(ALGraph G)
{
ArcNode *pp=NULL;
for(int i=1; i<=G.vexnum; i++)
{
pp=G.vertices[i].firstarc;
while(pp)
{
indegree[pp->adjvex]++;
outdegree[i]++;
pp=pp->nextarc;
}
}
}
int TopologicalSort(ALGraph G)
{
int S[Maxsize];
int top=0;
for(int i=1; i<=G.vexnum; i++)
{
if(indegree[i]==0)
{
top++;
S[top]=i;
}
}
int countt=0;
int ii=1;
ArcNode *pp=NULL;
while(top!=0)
{
ii=S[top];
top--;
printf("%d %c ",ii,G.vertices[ii].data);
countt++;
for(pp=G.vertices[ii].firstarc; pp; pp=pp->nextarc)
{
int k=pp->adjvex;
indegree[k]--;
if(indegree[k]==0)
{
top++;
S[top]=k;
}
}
}
if(countt<G.vexnum)
return -1;
else return 1;
}
int main()
{
ALGraph G;
char chx;
Create(G);
printf("The Adjacency List is:
");
Output(G);
memset(indegree,0,sizeof(indegree));
memset(outdegree,0,sizeof(outdegree));
Degree(G);
cout<<"The List of Indegree:"<<endl;
for(int i=1; i<=G.vexnum; i++)
{
printf("%d ",indegree[i]);
}
cout<<endl;
cout<<"The List of Outdegree:"<<endl;
for(int i=1; i<=G.vexnum; i++)
{
printf("%d ",outdegree[i]);
}
cout<<endl;
int flag=0;
printf("The List of Topological are:
");
flag=TopologicalSort(G);
printf("
");
if(flag==-1)
{
printf("Can not TopologicalSort!
");
}
else
{
printf("Topo Over!
");
}
memset(visited,0,sizeof(visited));
printf("Please Input the Start Data of the DFS:
");
while(scanf(" %c",&chx)!=EOF)
{
if(chx=='0') break;/// '0' ,
printf("The List of Dfs :
");
Dfs(G,chx);
cout<<endl;
memset(visited,0,sizeof(visited));
}
cout<<"DFS OVER!"<<endl;
memset(visited,0,sizeof(visited));
printf("Please Input the Start Data of the BFS:
");
while(scanf(" %c",&chx)!=EOF)
{
if(chx=='0') break;/// '0' ,
printf("The List of Bfs :
");
Bfs(G,chx);
cout<<endl;
memset(visited,0,sizeof(visited));
}
cout<<"BFS OVER!"<<endl;
return 0;
}
///*
4 4
A B C D
A B
A D
B C
D B
*///
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.