| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4785 人关注过本帖
标题:用C++写的最短路径
只看楼主 加入收藏
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
 问题点数:0 回复次数:18 
用C++写的最短路径

//AdjMWGraph.h

#include "SeqList.h" #include "SeqQueue.h"

const int MaxVertices=10; const int MaxWeight=10000; class AdjMWGraph { private: SeqList Vertices; int Edge[MaxVertices][MaxVertices]; int numOfEdges; public: AdjMWGraph(const int sz=MaxVertices); int GarphEmpty()const { return Vertices.ListEmpty();} int NumOfVertices(void){ return Vertices.ListSize();} int NumOfEdges(void){ return numOfEdges; } VerT GetValue(const int i); int GetWeight(const int v1,const int v2); void InsertVertex(const VerT &vertex); void InsertEdge(const int v1,const int v2,int weight); void DeleteVertex(const int i); void DeleteEdge(const int v1,const int v2); int GetFirstNeighbor(const int v); int GetNextNeighbor(const int v1,const int v2); void DepthFirstSearch(const int v,int visited[],void vist(VerT item)); void BroadFirstSearch(const int v1,int visited[],void visit(VerT item)); void DepthFirstSearch(void visit(VerT item)); void BroadFirstSearch(void vist(VerT item)); }; AdjMWGraph::AdjMWGraph(const int sz){ for(int i=0;i<sz;i++) for(int j=0;j<sz;j++) { if(i==j)Edge[i][j]=0; else Edge[i][j]=MaxWeight; } numOfEdges=0; } VerT AdjMWGraph::GetValue(const int i) { if(i<0||i>Vertices.ListSize()) { cerr<<"参数i越界出错!"<<endl; exit(1); } return Vertices.GetData(i); } int AdjMWGraph::GetWeight(const int v1,const int v2){ if(v1<0||v1>Vertices.ListSize()||v2<0||v2>Vertices.ListSize()){ exit(1); } return Edge[v1][v2]; } void AdjMWGraph::InsertVertex(const VerT &vertex) { Vertices.Insert(vertex,Vertices.ListSize()); } void AdjMWGraph::InsertEdge(const int v1,const int v2,int weight) { if(v1<0||v1>Vertices.ListSize()||v2<0||v2>Vertices.ListSize()){ exit(1); } Edge[v1][v2]=weight; numOfEdges++; } void AdjMWGraph::DeleteVertex(const int v){ for(int i=0;i<Vertices.ListSize();i++) for(int j=0;j<Vertices.ListSize();j++) if((i==v||j==v)&&Edge[i][j]>0&&Edge[i][j]<MaxWeight){ Edge[i][j]=MaxWeight; numOfEdges--; } Vertices.Delete(v); } void AdjMWGraph::DeleteEdge(const int v1,const int v2){ if(v1<0||v1>Vertices.ListSize()||v2<0||v2>Vertices.ListSize()) exit(1); Edge[v1][v2]=MaxWeight; numOfEdges--; } int AdjMWGraph::GetFirstNeighbor(const int v){ if(v<0||v>Vertices.ListSize()) exit(1); for(int col=0;col<Vertices.ListSize();col++) if(Edge[v][col]>0&&Edge[v][col]<MaxWeight) return col; return -1; } int AdjMWGraph::GetNextNeighbor(const int v1,const int v2){ if(v1<0||v1>Vertices.ListSize()||v2<0||v2>Vertices.ListSize()) exit(1); for(int col=v2+1;col<Vertices.ListSize();col++) if(Edge[v1][col]>0&&Edge[v1][col]<MaxWeight) return col; return -1; } void AdjMWGraph::DepthFirstSearch(const int v,int visited[],void visit(VerT item)){ visit(GetValue(v)); visited[v]=1; int w=GetFirstNeighbor(v); while(w!=-1){ if(!visited[w]) DepthFirstSearch(w,visited,visit); w=GetNextNeighbor(v,w); } } void AdjMWGraph::BroadFirstSearch(const int v,int visited[],void visit(VerT item)){ int u; int w; SeqQueue queue; visit(GetValue(v)); visited[v]=1; queue.EnQue(v); while(!queue.IsEmpty()){ u=queue.DeQue(); w=GetFirstNeighbor(v); while(w!=-1){ if(!visited[w]){ visit(GetValue(w)); visited[w]=1; queue.EnQue(w); } w=GetNextNeighbor(u,w); } } } void AdjMWGraph::DepthFirstSearch(void visit(VerT item)){ int *visited=new int[NumOfVertices()]; for(int i=0;i<NumOfVertices();i++) visited[i]=0; for(int i=0;i<NumOfVertices();i++) if(!visited[i]) DepthFirstSearch(i,visited,visit); delete []visited; } void AdjMWGraph::BroadFirstSearch(void visit(VerT item)){ int *visited=new int[NumOfVertices()]; for(int i=0;i<NumOfVertices();i++) visited[i]=0; for(int i=0;i<NumOfVertices();i++) if(!visited[i]) BroadFirstSearch(i,visited,visit); delete []visited; } //Dijkstra.h

void Dijkstra(AdjMWGraph &G,int v0,int distance[],int path[]){ int n=G.NumOfVertices(); int *s=new int[n]; int minDis,i,j,u; for(i=0;i<n;i++){ distance[i]=G.GetWeight(v0,i); s[i]=0; if(i!=v0&&distance[i]<MaxWeight) path[i]=v0; else path[i]=-1; } s[v0]=1; for(i=1;i<n;i++) { minDis=MaxWeight; for(j=0;j<n;j++) if(s[j]==0&&distance[j]<minDis){ u=j; minDis=distance[j]; } if(minDis==MaxWeight) return; s[u]=1; for(j=0;j<n;j++) if(s[j]==0&&G.GetWeight(u,j)<MaxWeight&&distance[u]+G.GetWeight(u,j)<distance[j]){ distance[j]=distance[u]+G.GetWeight(u,j); path[j]=u; } } }

//GraphLib.h

struct RowColWeight{ int cow; int col; int wieght; }; void CreatGarph(AdjMWGraph &G,DataType V[],int n,RowColWeight E[],int e){ for(int i=0;i<n;i++) G.InsertVertex(V[i]); for(int k=0;k<e;k++) G.InsertEdge(E[k].cow,E[k].col,E[k].wieght); } void Printchar(char item) { cout<<item<<" "; }

//SeqList.h #include<iostream> #include<stdlib.h> using namespace std;

const int MaxListSize=100; class SeqList{ DataType data[MaxListSize]; int size; public: SeqList(void); ~SeqList(void); int ListSize(void)const; int ListEmpty(void)const; int Find(DataType &item); DataType GetData(int pos)const; void Insert(const DataType& item,int pos); DataType Delete(const int pos); void ClearList(void); }; SeqList::SeqList(void):size(0){} SeqList::~SeqList(void){} int SeqList::ListSize(void)const{ return size; } int SeqList::ListEmpty(void)const{ if(size==0) return 1; else return 0; } int SeqList::Find(DataType &item){ if(size==0) return -1; int i=0; while(i<size&&item!=data[i])i++; return i; } DataType SeqList::GetData(int pos)const{ if(pos<0||pos>size-1){ cerr<<"参数pos越界!"<<endl; exit(1); } return data[pos]; } void SeqList::Insert(const DataType &item,int pos){ if(pos<0||pos>size){ cerr<<"参数越界!"<<endl; exit(1); } if(size==MaxListSize-1){ cerr<<"顺序表已经满!"<<endl; exit(1); } for(int i=size;i>pos;i--) data[i]=data[i-1]; data[pos]=item; size++; } DataType SeqList::Delete(const int pos) { if(size==0) { cerr<<"顺序表已空无元素可删!"<<endl; exit(1); } if(pos<0||pos>size-1){ cerr<<"参数越界!"<<endl; exit(1); } DataType temp=data[pos]; for(int i=pos;i<size-1;i++) data[i]=data[i+1]; size--; return temp; } void SeqList::ClearList(){ size=0; }

//SeqQueue.h #include<assert.h> #include<iostream> using namespace std; class SeqQueue{ int rear,front; DataType *element; int maxsize; public: SeqQueue(){rear=front=0;element=new char[100];} SeqQueue(int ms); ~SeqQueue(){delete []element;} bool IsEmpty()const{return rear==front;} bool IsFull()const{return (rear+1)%maxsize==front;} int Length()const{return (rear-front+maxsize)%maxsize;} void EnQue(const &data); DataType DeQue(); DataType GetNum(); }; SeqQueue::SeqQueue(int ms){ maxsize=ms; element=new char[maxsize]; rear=front=0; assert(element!=NULL); } void SeqQueue::EnQue(const &data){ assert(!IsFull()); rear=(rear+1)%maxsize; element[rear]=data; } DataType SeqQueue::DeQue(){ assert(!IsEmpty()); front=(front+1)%maxsize; return element[front]; } DataType SeqQueue::GetNum(){ assert(!IsEmpty()); front=(front+1)%maxsize; return element[front]; }

搜索更多相关主题的帖子: int Vertices 路径 const 
2005-05-24 16:47
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分:0 
嘻~~~~~~~

生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2005-05-25 07:28
jiulaiyicigu
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2005-10-23
收藏
得分:0 
DING
DING
2005-10-23 11:43
whaozhe
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2005-10-21
收藏
得分:0 
不是把



这还短啊


2005-10-23 19:49
James1982
Rank: 1
等 级:新手上路
帖 子:64
专家分:0
注 册:2005-10-7
收藏
得分:0 

数据结构怎么这么难呀!


2005-10-29 18:23
duhaiqing
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2005-9-2
收藏
得分:0 
2005-11-02 09:41
power4204
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-4-20
收藏
得分:0 
厉害!
2006-04-24 15:49
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 
没有什么厉害的,我都忘记了当初自己怎样写出来的

c++/C + 汇编 = 天下无敌
2006-04-24 20:45
xupeng
Rank: 1
等 级:新手上路
帖 子:4049
专家分:0
注 册:2006-2-12
收藏
得分:0 
能不能提供源代码下载啊!

反清复明 http://xupeng.
2006-04-24 20:56
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 

这个最多辛苦一点,自己复制到VC6.0里面,可以运行的


c++/C + 汇编 = 天下无敌
2006-04-24 22:47
快速回复:用C++写的最短路径
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016663 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved