图论最最基础,貌似没什么好说的。就是一个松弛的过程。
#include<cstdio>
const int inf=99999999;
const int mmax=1005;
int edge[mmax][mmax];
int dis[mmax];
bool vis[mmax];
int m,n;
void init()
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
edge[i][j]=inf;
}
void dij(int st,int en)
{
int mink;
for(int i=0;i<=n;i++)
{
dis[i]=inf;
vis[i]=false;
}
dis[st]=0;
for(int i=1;i<=n;i++)
{
for(int j=1,MM=inf;j<=n;j++)
{
if(!vis[j] && dis[j]<=MM)
{
MM=dis[j];
mink=j;
} ///寻找被松弛过、没松弛过别的点的最短距离点
vis[mink]=true;
for(int j=1;j<=n;j++) ///松弛过程
if(!vis[j] && dis[j]>dis[mink]+edge[mink][j])
dis[j]=dis[mink]+edge[mink][j];
}
}
for(int i=1;i<=n;i++) ///得到所有点到原点的最短距离
printf("dis[%d]:%d\n",i,dis[i]);
}
int main()
{
int st,en,len;
while(scanf("%d %d",&n,&m)!=EOF)
{
init();
while(m--)
{
scanf("%d %d %d",&st,&en,&len);
if(st!=en && edge[st][en]>len)
edge[st][en]=edge[en][st]=len;
}
scanf("%d %d",&st,&en);
dij(st,en);
}
return 0;
}