#include <iostream>
using namespace std;
const int max=9999;
void minpath(int v,int n,int d[100],int pre[100],int c[100][100])
{
int s[100];
for(int i=1;i<=n;i++)
{
d[i]=c[v][i];s[i]=0;
if(d[i]==max)pre[i]=0;
else
pre[i]=v;
}
d[v]=0;
s[v]=1;
for(int k=2;k<=n;k++)
{
int temp=max;
int t=v;
int j;
for(j=1;j<=n;j++)
{
if((s[j]==0)&&d[j]<temp)
{
t=j;temp=d[j];
}
}
s[t]=1;
for(j=1;j<=n;j++)
{
if((s[j]==0)&&c[t][j]<max)
{
int newd=d[t]+c[t][j];
if(newd<d[j])
{
pre[j]=t;d[j]=newd;
}
}
}
}
}
void searchpath(int pre[100],int v,int u)
{
int q[100];int p;
q[1]=u;p++;
int temp=pre[u];
for(p=2;temp!=v;p++)
{
q[p]=temp;temp=pre[temp];
}
q[p]=v;
for(int i=p;i>1;i--)
{
cout<<q[i]<<"->";
}
cout<<q[1];
cout<<endl;
}
int main()
{
int d[100],pre[100];
int c[100][100];
int i,j,p,q,length,n,m,v;
cout<<"请输入顶点个数:";
cin>>n;
cout<<"请输入路径个数:";
cin>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)c[i][j]=max;
}
cout<<"请依次输入路径始点、终点、距离:"<<endl;
cout<<"p"<<'\t'<<"q"<<'\t'<<"length"<<endl;
for(i=1;i<=m;i++)
{
cin>>p>>q>>length;c[p][q]=length;
}
cout<<"请输入要查找最短路径的终点:";
cin>>v;
minpath(1,n,d,pre,c);
cout<<"从源点到"<<v<<"的最短路径长度为:"<<d[v]<<endl;
cout<<"其路径为:";
searchpath(pre,1,v);
return 0;
}
数据结构:图的最短路径(C++代码实现)
最新推荐文章于 2022-09-04 10:34:47 发布