自己写的dijstra和floyd,测试了一下没有问题。
#include<iostream>
#include<vector>
#include<limits>
using namespace std;
#define inf INT_MAX
//邻接矩阵
void dijstra(vector<vector<int>> &gra, int beg, vector<int> &dist, vector<int> &pre)
{
for(int i=0;i<gra.size();i++)
{
dist[i] = gra[beg][i];
if(gra[beg][i] != inf)
pre[i] = beg;
}
pre[beg] = -1;
int num = gra.size();
vector<bool> flag(num, false);
flag[beg] = true;
while(1)
{
int zuijin = INT_MAX;
int zuijinpos = -1;
for(int j=0;j<num; j++)
{
if(!flag[j] && dist[j] < zuijin)
{
zuijin = dist[j];
zuijinpos = j;
}
}
if(zuijin == INT_MAX) break;
flag[zuijinpos] = true;
//cout<<"xian "<<zuijinpos<<endl;
for(int j=0;j<num; j++)
{
if(!flag[j] && dist[j] > dist[zuijinpos] + gra[zuijinpos][j])//
{
dist[j] = dist[zuijinpos] + gra[zuijinpos][j];
pre[j] = zuijinpos;
//cout<<"xianzai "<<j<<" "<<zuijinpos<<endl;
}
}
}
cout<<"dijstra______从beg到所有点的最短路径 "<<endl;
for(int i=0; i<num;i++)
cout<<dist[i]<<" ";
cout<<endl;
for(int i=0; i<num;i++)
{
cout<<i<<" 到 "<<beg<<" 最短路径 "<<endl;
for(int w = i; pre[w] != -1; w = pre[w])
{
cout<<w<<"->";
}
cout<<beg<<endl;
}
cout<<endl;
}
void floyd(vector<vector<int>> &gra, vector<vector<int>> &path)
{
int num = gra.size();
for(int i=0;i<num;i++)
for(int j=0; j<num; j++)
if(i!=j && gra[i][j] != inf)
path[i][j] = i;
for(int k=0; k<num; k++)
{
for(int i=0;i<num;i++)
{
for(int j=0; j<num; j++)
{
if( gra[i][k]+gra[k][j] > 0 && gra[i][k]+gra[k][j] < gra[i][j])
{
gra[i][j] = gra[i][k]+gra[k][j];
path[i][j] = k;
}
}
}
}
cout<<"floyd_____任意两点之间的最短路径矩阵 "<<endl;
for(int k=0; k<num; k++)
{
for(int i=0;i<num;i++)
cout<<gra[k][i]<<" ";
cout<<endl;
}
cout<<endl;
cout<<"floyd path矩阵 "<<endl;
for(int k=0; k<num; k++)
{
for(int i=0;i<num;i++)
cout<<path[k][i]<<" ";
cout<<endl;
}
cout<<endl;
for(int k=0;k<num;k++)
{
for(int i=0; i<num;i++)
{
cout<<i<<" to "<<k<<" 最短路径 "<<endl;
for(int w = i; path[k][w] != -1; w = path[k][w])
{
cout<<w<<"->";
}
cout<<k<<endl;
}
}
}
void creat(vector<vector<int>> &gra)
{
for(int i =0; i<gra.size(); i++)
gra[i][i] = 0;
}
void build(vector<vector<int>> &gra, int edgenum)
{
cout<<"输入边 "<<endl;
int beg, end, wei;
while(edgenum)
{
cin>>beg>>end>>wei;
gra[beg][end] = wei;
gra[end][beg] = wei;
edgenum--;
}
}
int main(void)
{
cout<<"输入节点数和边数 ";
int nodenum, edgenum;
cin>>nodenum>>edgenum;
vector<vector<int>> gra(nodenum, vector<int>(nodenum, inf));
creat(gra);
build(gra, edgenum);
vector<int> dist(gra.size(),inf);
vector<int> pre(gra.size(),-1);
int beg;
cout<<"输入dijstra单源点 ";
cin>>beg;
dijstra(gra,beg,dist,pre);
vector<vector<int>> path(gra.size(), vector<int>(gra.size(),-1));
floyd(gra, path);
}