套用模板,进行广搜。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
#define INFINITY 0
#define MAX_VERTEX_NUM 6001 //顶点最多个数
#define LENGTH 20 //顶点字符长度
//*********************************邻接表***********************************begin
typedef char VertexType[LENGTH];
typedef struct ArcNode{
int adjvex;
struct ArcNode* nextarc;
int weight;
}ArcNode;
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}VNode, AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;
int vexnum;
int arcnum;
}ALGraph;
int Judge(char *s1,char *s2){
int n1=strlen(s1);
int n2=strlen(s2);
if(n1!=n2) return 0;
int count=0;
for(int i=0;i<n1;i++){
if(s1[i]!=s2[i]) count++;
}
return count==1 ? 1 : 0;
}
int LocateVex(const ALGraph & g, char name[LENGTH]){
for (int i = 0; i < g.vexnum; i++)
if (0 == strcmp(g.vertices[i].data, name))
return i;
return -1;
}
//图的建造
void CreateGraph(ALGraph &g){
int i=0;
while(cin>>g.vertices[i].data){
g.vertices[i].firstarc = NULL;
i++;
}
g.vexnum=i;
ArcNode *p, *q;
ArcNode *pTmp;
g.arcnum=0;
for (int i = 0; i < g.vexnum; i++){
for(int j = i+1;j < g.vexnum;j++){
if(Judge(g.vertices[i].data,g.vertices[j].data)){
g.arcnum++;
int x = i;
int y = j;
p = new ArcNode;
q = new ArcNode;
p->adjvex = y;
p->nextarc = NULL;
p->weight = 1;
q->adjvex = x;
q->nextarc = NULL;
q->weight = 1;
if (NULL == g.vertices[x].firstarc)
g.vertices[x].firstarc = p;
else{
for (pTmp = g.vertices[x].firstarc; NULL != pTmp->nextarc; pTmp = pTmp->nextarc);
pTmp->nextarc = p;
}
if (NULL == g.vertices[y].firstarc)
g.vertices[y].firstarc = q;
else{
for (pTmp = g.vertices[y].firstarc; NULL != pTmp->nextarc; pTmp = pTmp->nextarc);
pTmp->nextarc = q;
}
}
}
}
}
//v的第一个邻接点
int FirstAdjVex(const ALGraph &g, int v){
if ( NULL != g.vertices[v].firstarc)
return g.vertices[v].firstarc->adjvex;
return -1;
}
//v相对于w的下一个邻接点
int NextAdjVex(const ALGraph &g, int v, int w){
ArcNode *p;
for (p = g.vertices[v].firstarc; NULL != p; p = p->nextarc)
if (p->adjvex == w && p->nextarc != NULL)
return p->nextarc->adjvex;
return -1;
}
//*********************************邻接表***********************************end
bool visit[MAX_VERTEX_NUM];
//广度优先遍历
int pre[MAX_VERTEX_NUM];
void BFSTraverse(ALGraph &g, char vName1[LENGTH],char vName2[LENGTH]){
memset(pre,-1,sizeof(pre));
int pos = LocateVex(g, vName1);
for (int v = 0; v < g.vexnum; v++)
visit[v] = false;
queue<int> q;
if (!visit[pos]){
pre[pos]=-1;//cout<<g.vertices[pos].data<<'\t';//访问
visit[pos] = true;
}
q.push(pos);
int v,w;
while (!q.empty()){
v = q.front();
q.pop();
for (w = FirstAdjVex(g, v); w >= 0; w = NextAdjVex(g, v, w)){
if (!visit[w]){
//cout<<g.vertices[w].data<<'\t';//访问
pre[w]=v;
visit[w] = true;
if(strcmp(g.vertices[w].data,vName2)==0) break;
q.push(w);
}
}
if(strcmp(g.vertices[w].data,vName2)==0) break;
}
//cout<<endl;
}
/******************************题目相关****************************************/
int Count(int pre[],int n){
int i,count=0;
for(i=n;i!=-1;i=pre[i]) count++;
return count;
}
int main(){
//freopen("input.txt","r",stdin);
ALGraph graph;
CreateGraph(graph);
BFSTraverse(graph, graph.vertices[0].data,graph.vertices[1].data);
cout<<Count(pre,1)<<endl;
return 0;
}