您的位置:首页 > 编程语言 > C语言/C++

迪杰斯特拉算法C++实现

2016-01-25 02:11 501 查看
迪杰斯特拉算法是经典的定点求最短路的算法,其原理是用贪心算法维护一颗最短路径树。算法复杂度是

n^2,通过剪枝可以适当优化。

#include<iostream>
using namespace std;
const int MAX=20;
const int INF=99999;
typedef bool pathmatrix[MAX+1][MAX+1];
typedef int shortpathTable[MAX+1];
typedef struct{
int vexnum,arcnum;
char vexs[MAX+1];
int arcs[MAX+1][MAX+1];
}MGraph;
void create_MG(MGraph &G)
{
int i,j,v1,v2,w;
cout<<"输入顶点和边的个数:"<<endl;
cin>>G.vexnum>>G.arcnum;
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=INF;
for(i=0;i<G.vexnum;i++)
{
cout<<"请输入第"<<i<<"个顶点:"<<endl;
cin>>G.vexs[i];
}
for(i=1;i<=G.arcnum;i++)
{
cout<<"输入边--格式:源点  终点  权值"<<endl;
cout<<"如0 2 10 "<<endl;
cin>>v1>>v2>>w;
G.arcs[v1][v2]=w;
}
}
void shortestpath_DIJ(MGraph &G,int v0,pathmatrix &P,shortpathTable &D)
{
bool final[MAX];
int v,w,j;
for(v=0;v<G.vexnum;v++)
{
final[v]=false;
D[v]=G.arcs[v0][v];
for(w=0;w<G.vexnum;w++)
{
P[v][w]=false;
}
if(D[v]<INF)
{
P[v][v0]=true;
P[v][v]=true;
}
}
D[v0]=0;
final[v0]=true;
for(v=1;v<G.vexnum;v++)
{
int min=INF;
for(w=0;w<G.vexnum;w++)
{
if(!final[w]&&D[w]<min)
{
min=D[w];
v=w;
}
}
final[v]=true;
for(w=0;w<G.vexnum;w++)
{
if(!final[w]&&min+G.arcs[v][w]<D[w])
{
D[w]=min+G.arcs[v][w];
for (j=0;j<G.vexnum;j++)
P[w][j]==P[v][j];
P[w][w]=true;
}
}
}
}
int main(void)
{
MGraph  G;
create_MG(G);
pathmatrix P;
shortpathTable D;
shortestpath_DIJ(G,0,P,D);
for(int i=0;i<G.vexnum;i++)
{
cout<<"v0到"<<i<<"的最短路"<<endl;
for`
int j=0;j<G.vexnum;j++)
{
cout<<P[i][j];
}
cout<<"路径长度"<<D[i]<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 算法 图论