代码:
#include<bits/stdc++.h>
using namespace std;
const int mm=1e9+5;
const int maxn=2505;
int n,m,s,t;
int graph[maxn][maxn];//存储图
int vis[maxn],dis[maxn];//存储是否经过,最短距离
void init()//初始化
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j) graph[i][j]=0;//自己到自己的距离0
else graph[i][j]=mm;//其它的初始化为无穷
}
}
return ;
}
void dij( )
{
int u;
int minn;
vis[s]=1;//初始化第一个点一定经过
for(int i=1;i<=n;i++)
dis[i]=graph[s][i];//初始化第一个点到其它点的距离
for(int i=1;i<n;i++)
{
minn=mm;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<minn)
//寻找到当前点的距离最短的点
{
minn=dis[j];
u=j;
}
}
vis[u]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>dis[u]+graph[u][j])
dis[j]=dis[u]+graph[u][j];
//更新路径
}
}
return ;
}
int main()
{
cout<<"请输入点的个数,边的个数,起点序号,终点序号:"<<endl;
cin>>n>>m>>s>>t;
memset(vis,0,sizeof(vis));
//初始化路径
init();
s++;t++;
int u,v,mid;
while(m--)
{
cin>>u>>v>>mid;
u++;v++;
graph[u][v]=min(mid,graph[u][v]) ;
graph[v][u]=min(mid,graph[v][u]) ;
//邻接矩阵存图
}
dij();
//输出最短距离
cout<<"最短距离为:"<<endl;
cout<<dis[t];
}
/*
样例1
11 22 0 10
0 1 2
0 2 8
0 3 1
1 2 6
2 3 7
1 4 1
2 4 5
2 5 1
2 6 2
3 6 9
4 5 3
5 6 4
4 7 2
4 8 9
5 8 6
6 8 3
6 9 1
7 8 7
8 9 1
7 10 9
8 10 2
9 10 4
*/