****原题洛谷P1339
过程为
1、存图 设置dis数组表示距离 vis数组表示该点有没有加入集合
2、确定初始点并加入集合
3、对于每一个集合中的点找到dis数组中离该点最近的那个点,推入集合中
4、用vis标记该点
5、更新vis长度
6、重复步骤3-5直至结束
代码如下:
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
int map[2501][2501];//存图
int vis[2501];//表示是否走过
int dis[2501];//表示两点距离
void add(int u,int v,int w){//存边
map[u][v]=w;
map[v][u]=w;
}
int main()
{
for(int i=1;i<=2500;i++)
dis[i]=1000000;//初始化距离,即很大
for(int i=1;i<=2500;i++)
for(int j=1;j<=2500;j++)
map[i][j]=1000000;//初始化距离
int n,m,s,t;
cin>>n>>m>>s>>t;//n点数 m边数 s起始点 t终点
while(m--){//存图
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
for(int i=1;i<=n;i++)
{
if(map[s][i]!=0)
dis[i]=map[s][i];
}
vis[s]=1;//初始化s点,即起点
for(int i=1;i<=n;i++)//一共有n个点,所以要执行n次加点入集合的操作
{
int minn=10000000;
int k=-1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<=minn)//将下一个点加入集合
{
k=j;
minn=dis[j];
}
}
if(k==-1) continue;
vis[k]=1;//标记该点已经走过
for(int j=1;j<=n;j++)
{
if(j==k) continue;
if(dis[k]+map[k][j]<dis[j])
dis[j]=dis[k]+map[k][j];//更新dis距离数组
}
}
cout<<dis[t]<<endl;//输出结果
}
```