using namespace std;struct ArcCell {
int adj; //存放弧长
bool *info; //是否用过该弧 };
struct _MGraph {
char vexs[20]; //存放站点 ArcCell arcs[20][20]; // int vexnum; int arcnum;
};
typedef int Path[20][20][20];
.可修编-
- . -
typedef int Distanc[20][20];
class MGraph //没用私有成员 { public: };
bool MGraph::CreateDN()//构造有向网 {
int i,j ,w; char v1, v2;
cout<<\"请输入站点个数,直接可达线路的条数: \"; cin>>mgraph.vexnum>>mgraph.arcnum ; cout<<\"\\n请输入各站点名: \";
for(i = 0;icin>>mgraph.vexs[i];_MGraph mgraph;//
void DestroyGraph(); //析构函数销毁图 int LocateVex (char u); // 返回顶点在图中的位置 bool CreateDN(); //构造有向网 void ShortestPath_FLOYD(Path &P,Distanc &D);
.可修编-
- . -
}
for(i = 0;ifor(j = 0;jif(i==j)mgraph.arcs[i][j].adj = 0;
//初始化邻接矩阵
else
mgraph.arcs[i][j].adj = 20000; //infinity;
mgraph.arcs[i][j].info = false;
}
for(i = 0;icout<<\"\\n请输入其中一条线路的起点站点名,终点站点名,需要时间(分}钟): \";
}
cin>>v1>>v2>>w; int m = LocateVex(v1); int n = LocateVex(v2);
mgraph.arcs[m][n].adj = w; // 的权值 .可修编-
- . -
return true;
}
void MGraph::DestroyGraph() { for(int i = 0 ;i{delete []mgraph.arcs[i][j].info; mgraph.arcs[i][j].info = false;
}
}
mgraph.vexnum = 0;
mgraph.arcnum = 0;
}
int MGraph::LocateVex(char u) {
.可修编-
- . -
}
for(int i = 0 ;i<20;i++) { } return -1;
if(u == mgraph.vexs[i]) { }
return i;
void MGraph::ShortestPath_FLOYD(Path &P,Distanc &D)//求每对顶点间的最短路径 // 用Floyd算法求有向网G中各对顶点v和w之间的最短路径P[v][w]及其带权长度D[v][w]
// 若P[v][w][u]为TRUE,则u是从v到w当前求得最短路径上的顶点。 {
int u,v,w,i;
for(v = 0;vfor(w = 0;wD[v][w] = mgraph.arcs[v][w].adj;// 顶点v到顶点w的直接距离 for(u = 0;u .可修编-- . -
P[v][w][u] = false; //路径矩阵初值
if(D[v][w]<20000) //从v到w有直接路径
P[v][w][v] = P[v][w][w] = true;//由v到w的路径经过v和w两点
}
}
for(u = 0;ufor(v = 0;vfor(w = 0;wif(D[v][u]+D[u][w]D[v][w] = D[v][u]+D[u][w];// 更新最短距离 for(i = 0;iP[v][w][i] = P[v][u][i]||P[u][w][i];//从v到w的路径经过//从v经u到w的一条路径更短从v到u和从u到w的所有路径
}
.可修编-
- . -
}
}
}
}
void main() {
MGraph g; Path p; // 3维数组 Distanc d; // 2维数组 int s,t,k; char v1,v2; float sum=0;
cout<<\"\\n***************欢迎使用交通指南系统**************\\n\"<cout<<\"\\n请依次输入您的出发站和目的站站点名称:\";cin>>v1>>v2; s=g.LocateVex (v1); t=g.LocateVex (v2);
g.ShortestPath_FLOYD(p,d);
if(s!=t)
.可修编-
- . -
{
int a=s;
cout<<\"\\n
由
站
点
\"<到站
点
\"<}for(k = 0;kif(p[s][t][k] == 1) { }cout<cout<<\"最短时间:\"<cout<<\"\\n\\n***************感您的使用!*****************\"<cout<<\"\\n\\n***************祝您旅途愉快!*****************\"<5.实现 .可修编-
- . -
.可修编-