背景:求最短路径,我的第一篇最短路径小试牛刀。
思维拓展:求最短路径有好几种算法,Dijkstra算法是没有负权路径求最短路径较好的算法之一,
思维过程:在S,V集合中,在V集合找出当前和S集合中最短距离的一点,并加入S集合中,迭代直到最后V集合为空。
代码大妈:
#include<iostream>
using namespace std;
int t[10][10];
int dist[10];
int flag[10];
#define Infty 2100000000;
void fi(int n)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
t[i][j]=Infty;
}
void dijista(int n,int a,int b)
{
for(int i=0;i<n;i++)
{
dist[i]=t[a][i];
flag[i]=0;
}
flag[a]=1;
for(int i=0,k;i<n;i++) //n个顶点就找出n次目前最短的然后更新路径
{
int min=Infty;
for(int j=0;j<n;j++)
{
if(flag[j]!=1&&dist[j]<min) //找出当前最短路径,加入S集合中
{
k=j;
min=dist[j];
}
}
printf("dist[k]: %d k: %d\n ",dist[k],k);
flag[k]=1;
if(k==b)
{
printf("a->b: %d\n ",dist[k]);
goto END;
}
for(int j=0;j<n;j++) //用最新的S集合来更新于V集合中点的距离
if(flag[j]!=1&&dist[j]>dist[k]+t[k][j])
dist[j]=dist[k]+t[k][j];
}
END:;
}
int main()
{
int n,m,a,b,p,q,w;
while(scanf("%d%d%d%d",&n,&m,&a,&b))//n顶点,m边数,a起点,b终点
{
fi(n);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&p,&q,&w);
t[p][q]=w;
t[q][p]=w;
}
dijista(n,a,b);
}
system("pause");
return 0;}