#include "stdafx.h"
#include <iostream>
using namespace std ;
#include <vector>
#include <limits>
static int maxInt=numeric_limits<int>::max();
//Dijkstra 单源最短路径
struct Graph_9
{
int vexnum,arcnum;
vector<vector<int> > arcs; //邻接矩阵
Graph_9(int ,int);
void printShortestPath();
~Graph_9(){for(int i=0;i<vexnum;++i) arcs[i].clear(); arcs.clear();}
};
Graph_9::Graph_9(int _vexnum,int _arcnum):vexnum(_vexnum),arcnum(_arcnum)
{
//初始化邻接矩阵
vector<int> arc(vexnum,maxInt);
for(int i=0;i<vexnum;++i)
arcs.push_back(arc);
//构造邻接矩阵
int v,w,base=1;
for(int i=0;i<arcnum;++i)
{
cin>>v>>w;
arcs[v][w]=base;
base*=2;
}
}
void Graph_9::printShortestPath()
{
//辅助数组D[i]表示0到i点的最短路径
vector<int> D(vexnum,maxInt);
//初始化D
for(int i=1;i<vexnum;++i)
D[i]=arcs[0][i];
//标志数组F[i]表示是否找到0到i点的最短路径
vector<int> F(vexnum,0);
//遍历顶点
int min,minIndex;
for(int i=1;i<vexnum;++i)
{
min=maxInt;
for(int j=1;j<vexnum;++j)
{
if(!F[j])
{
if(D[j]<min)
{
min=D[j];
minIndex=j;
}
}
}
F[minIndex]=1;
for(int k=1;k<vexnum;++k)
{
if(!F[k]&&(min+arcs[minIndex][k]<D[k]))
{
D[k]=min+arcs[minIndex][k];
}
}
}
for(int i=1;i<vexnum;++i)
{
if(D[i]==maxInt)
cout<<-1<<endl;
else
cout<<D[i]<<endl;
}
}
int main()
{
int vexnum,arcnum;
while(cin>>vexnum>>arcnum)
{
Graph_9* mGraph=new Graph_9(vexnum,arcnum);
mGraph->printShortestPath();
delete mGraph;
}
return 0;
}
Dijkstra 求单源最短路径
最新推荐文章于 2023-08-17 17:00:21 发布