#include <stdio.h>
#include <iostream>
#include <limits.h>
#include <queue>
#define INFINTY INT_MAX //最大值
#define MaxVertexNum 100 //最大頂點數
using namespace std;
typedef enum{DG,UDG,DN,UDN} GraphKind; //圖的種類(有向圖,無向圖,又向網,無向網)
typedef char VertexType; //頂點類型
typedef int AdjType; //邊的關係類型(對於無權圖,用1/0表示是否相鄰;
// 對帶權圖,則爲權值類型)
typedef char InfoType;
typedef struct {
AdjType adj;
InfoType* info; //該弧相關信息的指針
}ArcCell,AdjMatrix[MaxVertexNum][MaxVertexNum]; //定義弧和鄰接矩陣
typedef struct {
VertexType vertex[MaxVertexNum]; //頂點向量
AdjMatrix arcs; //鄰接矩陣
int vexnum,arcnum; //圖的當前頂點數和弧數
GraphKind kind;
int visited[MaxVertexNum]; //標示每個頂點是否被訪問過
}MGraph;
void CreateGraph(MGraph *G);
int LocateVex(MGraph *G,VertexType v);
void CreateDG(MGraph *G);
void CreateDN(MGraph *G);
void CreateUDG(MGraph *G);
void CreateUDN(MGraph *G);
void CommonInit(MGraph *G);
void display(MGraph *G);
void InsertDGArc(MGraph *G,VertexType v,VertexType w);
void InsertUDGArc(MGraph *G,VertexType v,VertexType w);
void DFSTraver(MGraph *G);
void BFSTraver(MGraph *G);
int main()
{
MGraph G;
CreateGraph(&G);
DFSTraver(&G);
BFSTraver(&G);
return 0;
}
//創建圖
void CreateGraph(MGraph *G)
{
printf("please enter the kind of the graph(DG:0,UDG:1,DN:2,UDN:3):");
scanf("%d",(int *)&(G->kind));
switch(G->kind) {
case DG: CreateDG(G); break;
case UDG: CreateUDG(G); break;
case DN: CreateDN(G); break;
case UDN: CreateUDN(G); break;
}
}
//求頂點位置函數
int LocateVex(MGraph *G,VertexType v)
{
int i;
for(i=0;i<G->vexnum;i++)
{
if(G->vertex[i] == v)
return i;
}
return -1;
}
/*
a b
a c
b d
c d
d a
*/
void CommonInit(MGraph *G)
{
int infoflag;//如果爲0,則不含其它信息。
//1.確定頂點數和弧數
printf("please enter vexnum , arcnum and is info(1 or 0):");
scanf("%d%d%d",&(G->vexnum),&(G->arcnum),&infoflag);
//2.確定各個頂點的值
printf("the value of each vertex:");
for(int i=0;i<G->vexnum;i++)
{
//getchar();
scanf(" %c",&(G->vertex[i]));
}
//3.初始化鄰接矩陣
for (int i = 0; i < G->vexnum; ++i)
{
for(int j=0;j< G->vexnum;j++)
{
G->arcs[i][j].adj = 0;
G->arcs[i][j].info = NULL;
}
}
}
//插入又向邊
void InsertDGArc(MGraph *G,VertexType v,VertexType w)
{
int i = LocateVex(G,v);
int j = LocateVex(G,w);
if(i>=0 && j>=0)
G->arcs[i][j].adj = 1;
}
//插入無向邊
void InsertUDGArc(MGraph *G,VertexType v,VertexType w)
{
int i = LocateVex(G,v);
int j = LocateVex(G,w);
if(i>=0 && j>=0) {
G->arcs[j][i].adj = 1;
G->arcs[i][j].adj = 1;
}
}
//創建有向圖
void CreateDG(MGraph *G)
{
CommonInit(G);
VertexType v1,v2;
//確定鄰接矩陣
printf("please input %d heads and %d tails:\n",G->arcnum,G->arcnum);
for(int k=0; k<G->arcnum; k++)
{
scanf(" %c %c",&v1,&v2);
InsertDGArc(G,v1,v2);
}
display(G);
}
//創建無向圖
void CreateUDG(MGraph *G)
{
CommonInit(G);
VertexType v1,v2;
//確定鄰接矩陣
printf("please input %d heads and %d tails:\n",G->arcnum,G->arcnum);
for(int k=0; k<G->arcnum; k++)
{
scanf(" %c %c",&v1,&v2);
InsertUDGArc(G,v1,v2);
}
display(G);
}
//創建又向網
void CreateDN(MGraph *G)
{
VertexType v1,v2;
int weight;
CommonInit(G);
//初始化鄰接矩陣
for (int i = 0; i < G->vexnum; ++i)
{
for(int j=0;j< G->vexnum;j++)
G->arcs[i][j].adj = INFINTY;
}
//確定鄰接矩陣
printf("please input %d heads and %d tails and weights:\n",G->arcnum,G->arcnum);
for(int k=0; k<G->arcnum; k++)
{
scanf(" %c %c %d",&v1,&v2,&weight);
int i = LocateVex(G,v1);
int j = LocateVex(G,v2);
if(i>=0 && j>=0)
{
G->arcs[i][j].adj = weight;
}
}
display(G);
}
//創建無向網
void CreateUDN(MGraph *G)
{
VertexType v1,v2;
int weight;
CommonInit(G);
//初始化鄰接矩陣
for (int i = 0; i < G->vexnum; ++i)
{
for(int j=0;j< G->vexnum;j++)
G->arcs[i][j].adj = INFINTY;
}
//確定鄰接矩陣
printf("please input %d heads and %d tails and weights:\n",G->arcnum,G->arcnum);
for(int k=0; k<G->arcnum; k++)
{
scanf(" %c %c %d",&v1,&v2,&weight);
int i = LocateVex(G,v1);
int j = LocateVex(G,v2);
if(i>=0 && j>=0)
{
G->arcs[i][j].adj = weight;
G->arcs[j][i].adj = weight;
}
}
display(G);
}
void display(MGraph *G)
{
for(int i=0;i<G->vexnum;i++)
{
for(int j=0;j<G->vexnum;j++)
{
printf("%d ",G->arcs[i][j].adj);
}
printf("\n");
}
}
void Visit(MGraph *G,int v)
{
printf("%c ",G->vertex[v]);
}
void DFS(MGraph *G,int v)
{
Visit(G,v);
G->visited[v] = 1;
for(int i=0;i<G->vexnum;i++) {
if(!(G->visited[i]) && G->arcs[v][i].adj == 1){
//cout<<G->visited[i];
DFS(G,i);
}
}
}
//深度優先遍歷
void DFSTraver(MGraph *G)
{
for (int i = 0; i < G->vexnum; i++)
{
G->visited[i] = 0;
}
printf("DFSTraver:\n");
for (int i = 0; i < G->vexnum; i++)
{
if(!G->visited[i])
DFS(G,i);
}
}
//返回節點v的第一個臨接頂點
int FirstAdjVertex(MGraph *G,int v)
{
for (int i = 0; i < G->vexnum; i++)
{
if(G->arcs[v][i].adj==1 && i!=v)
return i;
}
return -1;//如果沒有,返回-1
}
//返回v相對於w的下一個臨接點
int NextAdjVex(MGraph *G,int v,int w)
{
for (int i = w+1; i < G->vexnum; i++)
{
if(G->arcs[v][i].adj==1 && i!=v)
return i;
}
return -1;
}
void BFS(MGraph *G,int v)
{
int w;
Visit(G,v);
G->visited[v] = 1;
queue<int> q;
q.push(v);
while(!q.empty())
{
w = q.front();
q.pop(); //隊頭元素出隊
while(w!=-1)
{
if(!G->visited[w])
{
Visit(G,w);
G->visited[w] = 1;
q.push(w);
}
w = NextAdjVex(G,v,w);
}
}
}
//廣度度優先遍歷
void BFSTraver(MGraph *G)
{
printf("\nBFSTraver:\n");
for (int i = 0; i < G->vexnum; i++)
{
G->visited[i] = 0;
}
for (int i = 0; i < G->vexnum; i++)
{
if(!G->visited[i])
BFS(G,i);
}
}
各種圖的創建以及廣度,深度優先遍歷(臨接矩陣存儲)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.