#include "iostream"
#include "cstdio"
#define max 100
#define INF 99999
using namespace std;
int prev[max];//记录路径
int dist[max];//记录最短长度
int count,have_edge[max][max];
bool visited[max];
//图的存储(邻接矩阵)
void graph()
{
int m,n,q;
cout<<"请输入具有关系的各顶点及其权值,以“-1 -1 -1”作为结束标志:"<<endl;
while(cin>>m>>n>>q&&m!=-1&&n!=-1&&q!=-1)
have_edge[m][n]=q;
}
int firstadj(int v)
{
for(int w=1;w<=count;w++)
if(have_edge[v][w])
return w;
return 0;
}
int nextadj(int v,int w)
{
for(w=w+1;w<=count;w++)
if(have_edge[v][w])
return w;
return 0;
}
void dijk(int v0)
{
int w,v,i;
memset(visited,0,sizeof(visited));
visited[v0]=1;
//初始化起点到各顶点的最短路径及长度
for(i=1;i<=count;i++)
if(have_edge[v0][i])
{
dist[i]=have_edge[v0][i];
prev[i]=v0;
}
else
{
dist[i]=INF;
prev[i]=0;
}
//在未解顶点中搜索最近的顶点v
for(i=1;i<count;i++)
{
int min=INF;
for(int j=1;j<=count;j++)
if(!visited[j]&&dist[j]<min)
{
min=dist[j];
v=j;
}
visited[v]=1;
//更新dest
for(w=firstadj(v);w!=0;w=nextadj(v,w))
if(dist[v]+have_edge[v][w]<dist[w])
{
dist[w]=dist[v]+have_edge[v][w];
prev[w]=v;
}
}
}
//输出路径
void printf(int v0,int v1)
{
cout<<"路径最短长度为:"<<dist[v1]<<endl;
cout<<"从"<<v0<<"到"<<v1<<"的最短路径为:"<<endl;
cout<<v1<<" ";
while(prev[v1]!=v0)
{
cout<<prev[v1]<<" ";
v1=prev[v1];
}
cout<<v0<<" "<<endl;
}
int main()
{
// freopen("graph.txt","r",stdin);
int v0,v1;
cout<<"请输入结点总数:"<<endl;
cin>>count;
cout<<"请输入起始顶点:"<<endl;
cin>>v0;
memset(have_edge,0,sizeof(have_edge));
memset(dist,INF,sizeof(dist));
graph();
dijk(v0);
cout<<"请输入目的结点:"<<endl;
cin>>v1;
printf(v0,v1);
return 0;
}
Dijkstra
最新推荐文章于 2025-05-27 15:15:53 发布