这个题相比于最简单的单源最短路多了 起点 和 终点 的设置,所以我认为作为模板更好
适合了解过dijkstra算法的人
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define inf 0xfffffff
#define MAX 210
using namespace std;
int map[MAX][MAX],vis[MAX],dis[MAX];
int n,sum;
void init()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j) map[i][j]=0;
else map[i][j]=inf;
}
}
void dijkstra(int st)//st是起点
{
memset(vis,0,sizeof(vis));
int minn,k,i,j;
for(i=0;i<n;i++)
{
dis[i]=map[st][i];
}
vis[st]=1;
for(i=0;i<n;i++)
{
minn=inf;
k=1;
for(j=0;j<n;j++)
{
if(!vis[j]&&dis[j]<minn)
{
minn=dis[j];
k=j;
}
}
vis[k]=1;
for(j=0;j<n;j++)
{
if(!vis[j]&&dis[j]>dis[k]+map[k][j])
{
dis[j]=dis[k]+map[k][j];
}
}
}
}
int main()
{
int m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j,a,b,c;
int st,en;
init();
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c<map[a][b])
{
map[a][b]=map[b][a]=c;
}
}
scanf("%d%d",&st,&en);
dijkstra(st);
if(dis[en]<inf) cout<<dis[en]<<endl;
else cout<<"-1"<<endl;
}
return 0;
}