以无向图为例,存储方式采用邻接矩阵,DFS实现哈密尔顿链:
邻接矩阵的定义和创建:
int visited[10]={0};
//邻接矩阵定义
typedef struct ma{
char vexs[10];
int arcs[10][10];
int vexnum,arcnum;
}netgraph;
//定位点在矩阵的位置
int locate(netgraph G,char ch){
int t=-1;
for(int i=0;i<G.vexnum;i++){
if(G.vexs[i]==ch){
t=i;
break;
}
}
return t;
}
//邻接矩阵创建
void createNetgraph(netgraph *G){
printf("input the number of the vexs and arcs:\n");
scanf("%d%d",&G->vexnum,&G->arcnum);
getchar();
printf("input the data of the vexs:\n");
for(int i=0;i<G->vexnum;i++){
scanf("%c",&G->vexs[i]);
}
getchar();
//给邻接矩阵赋值
for(int i=0;i<G->vexnum;i++){
for(int j=0;j<G->vexnum;j++){
G->arcs[i][j]=0;
}
}
char ch1,ch2;
printf("input the arcs:\n");
scanf("%c%c",&ch1,&ch2);
int t1,t2;
getchar();
while(ch1!=' '){
t1=locate(*G,ch1);t2=locate(*G,ch2);
G->arcs[t1][t2]=1;G->arcs[t2][t1]=1;
printf("input the arcs:\n");
scanf("%c%c",&ch1,&ch2);
getchar();
}
}
求哈密尔顿链:
void print_path(int path[],netgraph G){
for(int i=0;i<G.vexnum;i++){
printf("%c ",G.vexs[path[i]]);
}
}
void bf_ha(netgraph G,int v0,int path[],int *n){
visited[v0]=1;
path[*n]=v0;(*n)++;
if((*n)==G.vexnum){
print_path(path,G);return;
}
for(int i=0;i<G.vexnum;i++){
if(G.arcs[v0][i]&&!visited[i]){
bf_ha(G,i,path,n);
}
}
visited[v0]=0;
(*n)--;
}
void BF_ha(netgraph G,int path[],int *n){
for(int i=0;i<G.vexnum;i++)
visited[i]=0;
for(int i=0;i<G.vexnum;i++){
if(visited[i]==0)
bf_ha(G,i,path,n);
}
}