一:图的输入:
1:先输入顶点和边数;
2:输入边数行,每行三个数,前两个数是从某个点到某个点,第三个数是这个边长的长度.
代码表示:
#define MAXN 60
#define INF 9999
void prepare()
{
int e[MAXN][MAXN];
int v,e;
for(int i=0;i<MAXN;i++)
{
for(int j=0;j<MAXN;j++)
{
if(i==j)
{
e[i][j]==0;
}
else
{
e[i][j]==INF;
}
}
}
int a,b,c;
cin>>v>>e;
for(int i=0;i<e;i++)
{
cin>>a>>b>>c;
}
return 0;
}
二:1;多元路径算法(任意两点之间的最短路径)时间复杂度(n的三次方)
这个算法只需要三个循环就可以了,其实很好理解,先用两个循环表示任意两点之间的距离,再用一个循环表示可以选取能取到的顶点作为中转点。
代码表示:
void jisuan()
{
for(int k=0;k<v;k++)
{
for(int i=0;i<v;i++)
{
for(int j=0;j<v;j++)
{
e[i][j]=min(e[i][k]+e[k][j],e[i][j]);
}
}
}
}
2:Dijkstra算法(主要解决单元最短路径的问题)
首先搞懂一个定义:
松弛:就是从某个点直接到某个点的距离大于利用中转点的两点之间的距离。
代码表示:
void Dijkstra()
{
int u;
int minn=INF;
for(int i=1;i<=V-1;i++)
{
minn=INF;
//找距离1号最近的顶点
for(int j=1;j<=V;j++)
{
if(book[j]==false&&dis[j]<minn)
{
minn=dis[j];
u=j;
}
}
book[u]=true;
//松弛
for(int k=1;k<=V;k++)
{
if(e[u][k]<INF)
dis[k]=min(dis[k],dis[u]+e[u][k]);
}
}
}