您的位置:首页 > 其它

图的基本操作

2015-11-19 16:03 218 查看
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stack>
#include<queue>

using namespace std;

#define Max 20

int visited[Max]={0};
int indegree[Max]={0};
typedef struct ArcNode
{
int adj;
struct ArcNode *nextarc;
}ArcNode;

typedef struct
{
char date;
ArcNode *firstarc;
}VNode,AdjList[Max];

typedef struct
{
AdjList vertices;
int vexnum,arcnum;
}AlGraph;

int Located(AlGraph &G,char v)
{
int i,k=-1;
for(i=0;i<G.vexnum;i++)
if(v==G.vertices[i].date)
{
k=i;
break;
}
return k;
}

void Creat_Graph(AlGraph &G)
{
int i,j,k;
int la,lb;
char V1,V2;
ArcNode *p,*s;
printf("输入图的顶点以及边的个数\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入图的顶点信息\n");
for(i=0;i<G.vexnum;i++)
{
getchar();
scanf("%c",&G.vertices[i].date);
G.vertices[i].firstarc=NULL;
}
printf("输入图每条边所依附的顶点\n");
for(k=0;k<G.arcnum;k++)
{
getchar();
scanf("%c %c",&V1,&V2);
la=Located(G,V1);
lb=Located(G,V2);
s=(ArcNode*)malloc(sizeof(ArcNode));
s->adj=lb;
s->nextarc=NULL;
p=G.vertices[la].firstarc;
if(!p)
G.vertices[la].firstarc=s;
else
{
while(p->nextarc)
p=p->nextarc;
p->nextarc=s;
}
}

}

void DFS(AlGraph G,char ch)
{
int v,w;
ArcNode *p;
v=Located(G,ch);
visited[v]=1;
printf("%c  ",G.vertices[v].date);
p=G.vertices[v].firstarc;
while(p)
{
w=p->adj;
if(visited[w]==0)
DFS(G,G.vertices[w].date);
p=p->nextarc;
}
}
void DFSTravel(AlGraph G)
{
int v;
for(v=0;v<G.vexnum;v++)
visited[v]=0;
for(v=0;v<G.vexnum;v++)
{
if(visited[v]==0)
DFS(G,G.vertices[v].date);
}
}

void Un_DFSTravel(AlGraph G)
{
stack<int>S;
ArcNode *p;
int i;
for(i=0;i<G.vexnum;i++)
visited[i]=0;
for(i=0;i<G.vexnum;i++)
{
if(visited[i]==0)
{
visited[i]=1;
printf("%c ",G.vertices[i].date);
S.push(i);
while(!S.empty())
{
p=G.vertices[S.top()].firstarc;
while(p)
{
if(!visited[p->adj])
{
printf("%c ",G.vertices[p->adj].date);
visited[p->adj]=1;
S.push(p->adj);
p=G.vertices[S.top()].firstarc;
}
else
p=p->nextarc;
}
S.pop();
}
}
}
}

void BFSTravel(AlGraph G)
{
queue<int>Q;
int i,v;
ArcNode *p;
int s;
for(i=0;i<G.vexnum;i++)
visited[i]=0;
for(v=0;v<G.vexnum;v++)
{
if(!visited[v])
{
visited[v]=1;
printf("%c ",G.vertices[v].date);
Q.push(v);
while(!Q.empty())
{
s=Q.front();
p=G.vertices[s].firstarc;
while(p)
{
if(!visited[p->adj])
{
visited[p->adj]=1;
printf("%c ",G.vertices[p->adj].date);
Q.push(p->adj);
}
else
p=p->nextarc;
}
Q.pop();
}
}
}
}

void Finddgree(AlGraph G,int indegree[])
{
int i;
ArcNode *p;
for(i=0;i<G.vexnum;i++)
indegree[i]=0;
for(i=0;i<G.vexnum;i++)
{
p=G.vertices[i].firstarc;
while(p)
{
indegree[p->adj]++;
p=p->nextarc;
}
}

}

void TopologicalSort(AlGraph G)
{
stack<int>S;
int num;
int k,i;
ArcNode *p;
Finddgree(G,indegree);
for(i=0;i<G.vexnum;i++)
if(!indegree[i])
S.push(i);
num=0;
while(!S.empty())
{
i=S.top();
S.pop();
printf("%c  ",G.vertices[i].date);
num++;
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
{
k=p->adj;
if(!(--indegree[k]))
S.push(k);

}
}
if(num<G.vexnum)
printf("这是一个有环图\n");
else
printf("这是一个无环图\n");

}

int main()
{
AlGraph G;

Creat_Graph(G);
printf("深度搜索递归序列\n");
DFSTravel(G);
putchar('\n');
printf("深度搜索非递归序列\n");
Un_DFSTravel(G);
putchar('\n');
printf("广度搜索递归序列\n");
BFSTravel(G);
putchar('\n');
printf("拓扑序列\n");
TopologicalSort(G);
putchar('\n');
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: