图
Question one
#include "ljb.h"
void degree(LinkedGraph g)
{
EdgeNode *p;
int count;
int i;
for(i = 0; i < g.n; i ++)
{
count = 0;
p = g.adjlist[i].FirstEdge;
while(p)
{
count++;
p = p->next;
}
printf("D(%d) = %d\n",i, count);
}
}
int main()
{ LinkedGraph g;
creat(&g,"g11.txt",0);
printf("\n The graph is:\n");
print(g);
degree(g);
return 0;
}
Question two
#include "ljb.h"
int visited[M];
void bfs(LinkedGraph g, int i)
{
int queue[M], v;
int head = 0, end = 0;
EdgeNode *p;
queue[end++] = i;
visited[i] = 1;
while(head < end)
{
v = queue[head++];
printf("%c ",g.adjlist[v].vertex);
p = g.adjlist[v].FirstEdge;
while(p)
{
if(visited[p->adjvex] == 0)
{
queue[end++] = p->adjvex;
visited[p->adjvex] = 1;
}
p = p->next;
}
}
}
int BfsTraverse(LinkedGraph g)
{ int i,count=0;
for (i=0;i<g.n;i++)
visited[i]=0;
for (i=0;i<g.n;i++)
if (!visited[i])
{printf("\n");
count++;
bfs(g,i);
}
return count;
}
int main()
{ LinkedGraph g;
int count;
creat(&g,"g11.txt",0);
printf("\n The graph is:\n");
print(g);
printf("广度优先遍历序列为:\n");
count=BfsTraverse(g);
printf("\n该图共有%d个连通分量。\n",count);
return 0;
}
Question three
#include "ljb.h"
int visited[M];
void dfs(LinkedGraph g,int i)
{
EdgeNode *p;
printf("visit vertex: %c \n",g.adjlist[i].vertex);
visited[i]=1;
p=g.adjlist[i].FirstEdge;
while (p)
{
if(visited[p->adjvex] == 0)
dfs(g, p->adjvex);
p = p->next;
}
}
void DfsTraverse(LinkedGraph g)
{ int i;
for (i=0;i<g.n;i++)
visited[i]=0;
for (i=0;i<g.n;i++)
if (!visited[i])
dfs(g,i);
}
int main()
{ LinkedGraph g;
creat(&g,"g11.txt",0);
printf("\n The graph is:\n");
print(g);
printf("深度优先遍历序列为:\n");
DfsTraverse(g);
}
Question four
#include "ljjz.h"
typedef struct edgedata
{ int beg,en;
int length;
}edge;
void prim(Mgraph g, edge tree[M-1])
{ edge x;
int d,min,j,k,s,v;
for (v=1;v<=g.n-1;v++)
{
tree[v-1].beg=0;
tree[v-1].en=v;
tree[v-1].length=g.edges[0][v];
}
for (k=0;k<=g.n-3;k++)
{
min=tree[k].length;
s=k;
for (j=k+1;j<=g.n-2;j++)
if (tree[j].length<min)
{
min=tree[j].length;
s=j;
}
v=tree[s].en;
x=tree[s];
tree[s]=tree[k];
for (j=k+1;j<=g.n-2;j++)
{
d=g.edges[v][tree[j].en];
if (d<tree[j].length)
{
tree[j].length=d;
tree[j].beg=v;
}
}
}
printf("\n最小生成树是:\n");
for (j=0;j<=g.n-2;j++)
printf("\n%c---%c %d\n",g.vexs[tree[j].beg],g.vexs[tree[j].en],tree[j].length);
printf("\n最小生成树的根是: %c\n", g.vexs[0]);
}
int main()
{
Mgraph g;
edge tree[M-1];
creat(&g,"g.txt",0);
print(g);
prim(g,tree);
return 0;
}
Question five
#include "ljjz.h"
typedef enum{FALSE,TRUE} boolean;
typedef int dist[M];
typedef int path[M];
void dijkstra(Mgraph g,int v0,path p,dist d)
{ boolean final[M];
int i,k,j,v,min,x;
for (v=0;v<g.n;v++)
{
final[v]=FALSE;
d[v]=g.edges[v0][v];
if (d[v]<FINITY &&d[v]!=0)
p[v]=v0; else p[v]=-1;
}
final[v0]=TRUE;
d[v0]=0;
for (i=1;i<g.n;i++)
{
min=FINITY;
for (k=0;k<g.n;k++)
if (!final[k] && d[k]<min)
{
v=k;
min=d[k];
}
if (min==FINITY) return ;
final[v]=TRUE;
for (k=0;k<g.n;++k)
if (!final[k] && (min+g.edges[v][k]<d[k]))
{
d[k]=min+g.edges[v][k];
p[k]=v;
}
}
}
void print_gpd(Mgraph g,path p,dist d)
{
int st[M],i,pre,top=-1;
for (i=0;i<g.n;i++)
{ printf("\nDistancd: %7d , path:" ,d[i]);
st[++top]=i;
pre=p[i];
while (pre!=-1)
{ st[++top]=pre;
pre=p[pre];
}
while (top>0)
printf("%2d",st[top--]);
}
}
int main()
{ Mgraph g;
path p;
dist d;
int v0;
creat(&g,"g21.txt",1);
print(g);
printf("\n");
printf("请输入源点编号:");
scanf("%d",&v0);
dijkstra(g,v0,p,d);
print_gpd(g,p,d);
return 0;
}
Question six
#include<stdlib.h>
#include<stdio.h>
#define M 20
typedef char vertextype;
typedef struct node{
int adjvex;
struct node *next;
}edgenode;
typedef struct de
{
edgenode* FirstEdge;
vertextype vertex;
int id;
}vertexnode;
typedef struct{
vertexnode adjlist[M];
int n,e;
}AovGraph;
void creat(AovGraph *g,char *filename)
{ int i,j,k;
edgenode *s;
FILE *fp;
fp=fopen(filename,"r");
if (fp)
{
fscanf(fp,"%d%d",&g->n,&g->e);
for(i=0;i<g->n;i++)
{fscanf(fp,"%1s",&g->adjlist[i].vertex);
g->adjlist[i].FirstEdge=NULL;
g->adjlist[i].id=0;
}
for(k=0;k<g->e;k++)
{ fscanf(fp,"%d%d",&i,&j);
s=(edgenode*)malloc(sizeof(edgenode));
s->adjvex=j;
g->adjlist[j].id++;
s->next=g->adjlist[i].FirstEdge;
g->adjlist[i].FirstEdge=s;
}
}
}
void print(AovGraph g)
{ edgenode *p;
int i;
for (i=0;i<g.n;i++)
{ printf("%c %d ", g.adjlist[i].vertex,g.adjlist[i].id);
p=g.adjlist[i].FirstEdge;
while (p)
{ printf("%d-->",p->adjvex);
p=p->next;
}
printf("\n");
}
}
int TopSort(AovGraph g)
{int k=0,i,j,v, flag[M];
int queue[M];
int h=0,t=0;
edgenode* p;
for (i=0;i<g.n;i++) flag[i]=0;
for (i=0;i<g.n;i++)
if (g.adjlist[i].id==0)
{
queue[t++]=i;
flag[i]=1;
}
while (h<t)
{
v=queue[h++];
printf("%c ",g.adjlist[v].vertex);
k++;
p=g.adjlist[v].FirstEdge;
while (p)
{
j=p->adjvex;
g.adjlist[j].id--;
if (g.adjlist[j].id==0 && flag[j]==0)
{ queue[t++]=j;
flag[j]=1;
}
p=p->next;
}
}
return k;
}
int main()
{ int k=0;
AovGraph g;
creat(&g,"aov.txt");
printf("\n图8.27所示AOV网的邻接表是:\n");
print(g);
k=TopSort(g);
if(k<g.n) printf("\n该图存在环!\n");
return 0;
}