小说网 找小说 无限小说 烟雨红尘 幻想小说 酷文学 深夜书屋

基于visual Studio2013解决算法导论之042单源最短路径




题目

单源最短路径


解决代码及点评

// 26单源最短路径bellmanford.cpp : 定义控制台应用程序的入口点。
//

#include <iostream>
#include <deque>
#include <algorithm>

using namespace std;

#define MAX_VERTEX_NUM    20
#define INFINITY    2147483647 
struct adjVertexNode 
{
	int adjVertexPosition;
	int weight;
	adjVertexNode* next; 
};
struct VertexNode
{
	char data[2];
	int distance;
	VertexNode* path;
	adjVertexNode* list;
}; 
struct Graph
{
	VertexNode VertexNode[MAX_VERTEX_NUM];
	int vertexNum;
	int edgeNum;
};

void CreateGraph (Graph& g)
{
	int i, j, edgeStart, edgeEnd, edgeWeight;
	adjVertexNode* adjNode;

	g.vertexNum=7;
	g.edgeNum=14;

	for (i=0;i<g.vertexNum;i++) 
	{
		cout<<"输入结点";
		cin >> g.VertexNode[i].data; // vertex data info.
		cout<<endl;
		g.VertexNode[i].list=NULL; 
	}

	for (j=0; j<g.edgeNum; j++) 
	{ 
		cout<<endl<<"输入起点(节点序号)";
		cin >>edgeStart ;
		cout<<endl<<"输入终点(节点序号)";
		cin>>edgeEnd;
		cout<<endl<<"输入权值";
		cin>> edgeWeight; 
		adjNode = new adjVertexNode; 
		adjNode->weight = edgeWeight;
		adjNode->adjVertexPosition = edgeEnd-1; 
		// 将邻接点信息插入到顶点Vi的边表头部,注意是头部!!!不是尾部。
		adjNode->next=g.VertexNode[edgeStart-1].list; 
		g.VertexNode[edgeStart-1].list=adjNode; 
	}
}

void PrintAdjList(const Graph& g)
{
	for (int i=0; i < g.vertexNum; i++)
	{
		cout<< g.VertexNode[i].data << "->";
		adjVertexNode* head = g.VertexNode[i].list;
		if (head == NULL)
			cout << "NULL";
		while (head != NULL)
		{
			cout << head->adjVertexPosition + 1 <<" ";
			head = head->next;
		}
		cout << endl;
	}
}
void DeleteGraph(Graph &g)
{
	for (int i=0; i<g.vertexNum; i++)
	{
		adjVertexNode* tmp=NULL;
		while(g.VertexNode[i].list!=NULL)
		{
			tmp = g.VertexNode[i].list;
			g.VertexNode[i].list = g.VertexNode[i].list->next;
			delete tmp;
			tmp = NULL;
		}
	}
}
void BellmanFord(Graph& g, VertexNode& s)
{
	deque<VertexNode*> q;
	for (int i=0; i<g.vertexNum; i++)
	{
		g.VertexNode[i].distance = INFINITY;
		g.VertexNode[i].path = NULL;
	}
	s.distance = 0;
	q.push_back(&s);

	int counter = 0;
	while(!q.empty())
	{
		VertexNode* v = q.front();
		q.pop_front();
		if(v==NULL)
			break;

		adjVertexNode* head = v->list;
		while (head != NULL)
		{
			VertexNode* w = &g.VertexNode[head->adjVertexPosition];
			if(v->distance + head->weight < w->distance)
			{
				w->distance = v->distance + head->weight;
				w->path = v;
				if (find(q.begin(), q.end(), w)==q.end())
				{
					q.push_back(w);
				}
			}
			head = head->next;
		}
		counter++;
		if (counter>g.vertexNum * g.edgeNum)
		{
			cout<<"值为负"<<endl;
			exit(1);
		}
	}
}
void PrintPath(Graph& g, VertexNode* source, VertexNode* target)
{
	if (source!=target && target->path==NULL)
	{
		cout << "无路径 " << endl;
	}
	else
	{
		if (target->path!=NULL)
		{
			PrintPath(g, source, target->path);
			cout << " ";
		}
		cout << target->data ;
	}
}

int main(int argc, const char ** argv)
{
	Graph g;
	CreateGraph(g);
	PrintAdjList(g);
	VertexNode& start = g.VertexNode[0];
	VertexNode& end = g.VertexNode[6];
	BellmanFord(g, start);

	PrintPath(g, &start, &end);
	cout << endl;
	DeleteGraph(g);
	system("pause");
	return 0;
}





代码下载及其运行

代码下载地址:http://download.csdn.net/detail/yincheng01/6858815

解压密码:c.itcast.cn


下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:

1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”


2)在下拉框中选择相应项目,项目名和博客编号一致

3)点击“本地Windows调试器”运行


程序运行结果









posted on 2014-01-17 21:04  牛栏山1  阅读(85)  评论(0编辑  收藏  举报

导航