问题描述:给定带权有向图G=(V,E), 其中每条边的权是一个非负实数.要计算从V的一点v0(源)到所有其他各顶点的最短路长度. 路长指路上各边权之和。
图中1为源点,求出它到其他各点的最短路径,用数组存储此图,
/*初始化有向图*/
int c[6][6];
int i,j;
//int maxint=1000;
for(i=0;i<6;i++)
{
for(j=0;j<6;j++ )
{
c[i][j]=maxint;
}
}
c[1][2]=10;
c[1][4]=30;
c[1][5]=100;
c[2][3]=50;
c[3][5]=10;
c[4][3]=20;
c[4][5]=60;
其中maxint是比最大的权还大的数,用maxint代替数组中没有有向边的两点的权值,而不能用0代替,因为我们要求最短的路径,用0影响查找
#include
"
stdafx.h
"
#include < cstdio >
#include < iostream >
using namespace std;
const int maxint = 1000 ;
void Dijkstra( int n, int v, int dist[], int prev[], int c[][ 6 ]) // n为点数量,v为起始点,dist数组存储选择的边的权,prev[i]代表i点前一顶点,c为有向图数组
... {
bool s[100];
for (int i=1;i<=n; i++)
...{
dist[i]=c[v][i];
s[i]=false;
if(dist[i]==maxint)
...{
prev[i]=0;
}
else
...{
prev[i]=v ;
}
}
dist[v]=0;
s[v]=true;
for (int i=1;i<n;i++)
...{
int temp=maxint;
int u= v;
for (int j = 2;j<=n;j++)
if ((!s[j])&&(dist[j]<temp))
...{
u=j;
temp=dist[j];
}
s[u]=true;
for (int j=2;j<=n;j++)
if((!s[j])&&(c[u][j]<maxint))
...{
int newdist=dist[u]+c[u][j];
if (newdist<dist[j])
...{
dist[j]=newdist;
prev[j]=u;
}
}
}
/**//*输出从原点到其他顶点之间的最短路径长度*/
cout<<"输出从原点到其他顶点之间的最短路径长度"<<endl;
for(int j=2;j<6;j++)
...{
cout<<"dist["<<j<<"]"<<":"<<dist[j]<<endl;
}
/**//*输出所选的边*/
cout<<"输出所选的边"<<endl;
for(int t=2;t<6;t++)
...{
cout<<prev[t]<<"->"<<t<<endl;
}
}
int main()
... {
/**//*初始化有向图*/
int c[6][6];
int i,j;
//int maxint=1000;
for(i=0;i<6;i++)
...{
for(j=0;j<6;j++ )
...{
c[i][j]=maxint;
}
}
c[1][2]=10;
c[1][4]=30;
c[1][5]=100;
c[2][3]=50;
c[3][5]=10;
c[4][3]=20;
c[4][5]=60;
cout<<"有向图矩阵如下:代表两点之间无有向边"<<endl;
for(i=1;i<6;i++)
...{
for(j=1;j<6;j++ )
...{
cout<<c[i][j]<<" ";
}
cout<<endl;
}
int dist[6];
int prev[6];
int n=5;
int v=1;
Dijkstra(n,v,dist,prev,c);
return 0;
}
#include < cstdio >
#include < iostream >
using namespace std;
const int maxint = 1000 ;
void Dijkstra( int n, int v, int dist[], int prev[], int c[][ 6 ]) // n为点数量,v为起始点,dist数组存储选择的边的权,prev[i]代表i点前一顶点,c为有向图数组
... {
bool s[100];
for (int i=1;i<=n; i++)
...{
dist[i]=c[v][i];
s[i]=false;
if(dist[i]==maxint)
...{
prev[i]=0;
}
else
...{
prev[i]=v ;
}
}
dist[v]=0;
s[v]=true;
for (int i=1;i<n;i++)
...{
int temp=maxint;
int u= v;
for (int j = 2;j<=n;j++)
if ((!s[j])&&(dist[j]<temp))
...{
u=j;
temp=dist[j];
}
s[u]=true;
for (int j=2;j<=n;j++)
if((!s[j])&&(c[u][j]<maxint))
...{
int newdist=dist[u]+c[u][j];
if (newdist<dist[j])
...{
dist[j]=newdist;
prev[j]=u;
}
}
}
/**//*输出从原点到其他顶点之间的最短路径长度*/
cout<<"输出从原点到其他顶点之间的最短路径长度"<<endl;
for(int j=2;j<6;j++)
...{
cout<<"dist["<<j<<"]"<<":"<<dist[j]<<endl;
}
/**//*输出所选的边*/
cout<<"输出所选的边"<<endl;
for(int t=2;t<6;t++)
...{
cout<<prev[t]<<"->"<<t<<endl;
}
}
int main()
... {
/**//*初始化有向图*/
int c[6][6];
int i,j;
//int maxint=1000;
for(i=0;i<6;i++)
...{
for(j=0;j<6;j++ )
...{
c[i][j]=maxint;
}
}
c[1][2]=10;
c[1][4]=30;
c[1][5]=100;
c[2][3]=50;
c[3][5]=10;
c[4][3]=20;
c[4][5]=60;
cout<<"有向图矩阵如下:代表两点之间无有向边"<<endl;
for(i=1;i<6;i++)
...{
for(j=1;j<6;j++ )
...{
cout<<c[i][j]<<" ";
}
cout<<endl;
}
int dist[6];
int prev[6];
int n=5;
int v=1;
Dijkstra(n,v,dist,prev,c);
return 0;
}