南邮数据结构实验3 (2)飞机最少换乘

//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;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值