北大校赛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;
}


 

posted on 2013-05-11 16:35  Gddxz  阅读(121)  评论(0编辑  收藏  举报

导航