//VC6.0下编译
#include<iostream.h>
#include<string.h>
const int INF=2147483647;
enum ResultCode{Underflow,Duplicate,Failure,Success,NotPresent,OutOfBounds};
template <class T>
class Graph //抽象类
{
public:
virtual ResultCode Insert(int u,int v,T w)=0;
virtual ResultCode Remove(int u,int v)=0;
virtual bool Exist(int u,int v)const=0;
protected:
int n,e;
};
template <class T>
class MGraph:public Graph<T> //邻接矩阵类
{
public:
MGraph(int mSize,const T noedg);
~MGraph();
ResultCode Insert(int u,int v,T w);
ResultCode Remove(int u,int v);
bool Exist(int u,int v)const;
int Choose(int *d,bool *s);
void Dijkstra(int v,T *d,int *path);
protected:
T **a;
T noEdge;
};
template <class T>
MGraph<T>::MGraph(int mSize,const T noedg)
{
n=mSize;
e=0;
noEdge=noedg;
a=new T*[n];
for(int i=0;i<n;i++)
{
a[i]=new T[n];
for(int j=0;j<n;j++)
a[i][j]=noEdge;
a[i][i]=0;
}
}
template <class T>
MGraph<T>::~MGraph()
{
for(int i=0;i<n;i++)
delete []a[i];
delete []a;
}
template <class T>
ResultCode MGraph<T>::Insert(int u,int v,T w)
{
if(u<0||v<0||u>n-1||v>n-1||u==v)
return Failure;
if(a[u][v]!=noEdge)
return Duplicate;
a[u][v]=w;
e++;
return Success;
}
template <class T>
ResultCode MGraph<T>::Remove(int u,int v)
{
if(u<0||v<0||u>n-1||v>n-1||u==v)
return Failure;
if(a[u][v]==noEdge)
return NotPresent;
a[u][v]=noEdge;
e--;
return Success;
}
template<class T>
bool MGraph<T>::Exist(int u,int v)const
{
if(u<0||v<0||u>n-1||v>n-1||u==v||a[u][v]==noEdge)
return false;
return true;
}
template <class T>
int MGraph<T>::Choose(int *d,bool *s) //求最小d[i]
{
int i,minpos;
T min;
min=INF;
minpos=-1;
for(i=0;i<n;i++)
if(d[i]<=min&&!s[i])
{
min=d[i];
minpos=i;
}
return minpos;
}
template <class T>
void MGraph<T>::Dijkstra(int v,T *d,int *path) //迪杰斯特拉算法
{
int i,k,w;
if(v<0||v>n-1)
throw OutOfBounds;
bool *s=new bool[n];
for(i=0;i<n;i++)
{
s[i]=false;
d[i]=a[v][i];
if(i!=v&&d[i]<INF)
path[i]=v;
else
path[i]=-1;
}
s[v]=true;
d[v]=0;
for(i=1;i<n;i++)
{
k=Choose(d,s);
s[k]=true;
for(w=0;w<n;w++)
if(!s[w]&&(d[k]+a[k][w])<d[w])
{
d[w]=d[k]+a[k][w];
path[w]=k;
}
}
}
int main()
{
int n,m;
cout<<"请输入城市个数:";
cin>>n;
cout<<"请输入航线条数:";
cin>>m;
MGraph<int>A(n,INF);
int c,f;
cout<<"请输入每条航线的起点和终点: "<<endl;
for(int i=0;i<m;i++)
{
cout << "航线" << i+1 <<": ";
cin>>c>>f;
A.Insert(c,f,1);
}
char s;
do{
int v,w;
cout<<"请输入你的起点和终点:";
cin>>v>>w;
while(v<0||w<0||w>n-1||v>n-1)
{
cout<<"输入错误!请重新输入:";
cin>>v>>w;
}
int *b=new int[n];
int *d=new int[n];
int *path=new int[n];
A.Dijkstra(v,d,path);
int e=n-1;
for(int j=0;j<n;j++)
b[j]=-2;
if(w!=v)
{
j=w;
while(path[j]!=-1)
{
b[e]=path[j];
e--;
j=path[j];
}
if(e==n-1||d[j]==INF)
cout<<"该路间无线路!"<<endl;
else
{
cout<<"从"<<v<<"到"<<w<<"的换乘次数最小的线路方案为:";
for(int k=0;k<n;k++)
{
if(b[k]!=-2)
cout<<b[k]<<",";
}
cout<<w<<endl;
}
}
if(w==v)
cout<<"从"<<v<<"到"<<i<<"该路间无需乘飞机!"<<endl;
delete []b;
delete []d;
delete []path;
cout<<"请问是否继续查询路线?请输入Y/N:";
cin>>s;
while(s!='Y'&&s!='y'&&s!='n'&&s!='N')
{
cout<<"输入错误!请重新输入:";
cin>>s;
}
}while(s=='Y'||s=='y');
return 0;
}
南邮数据结构实验3 (2)飞机最少换乘
最新推荐文章于 2022-06-22 20:52:17 发布