北大校赛2011 Word Ladder(C题) 解题报告
套用模板,进行广搜。
#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; }