题目链接
这是一个最短路算法,并且单一起点单一终点,哈哈可以说是很模板的一个题了,用到的算法就是Dijkstra算法,这也是我最近在学校上数据结构课学到的算法,当时还不会实现,现在知道怎么实现了。
这个算法的精华部分就是
for(int i=0;i<n;i++)
{
if(imap[s][i]!=lnf)
dis[i]=min(dis[i],dis[s]+imap[s][i]);
if(vis[i]&&dis[i]<imin)
{
inext=i;
imin=dis[i];
}
}
这个题目写的时候要注意范围,要注意是从0开始还是从1开始,上限的极限是什么。
对二维数组进行大数初始化的时候先不要使用memset函数否则会出现问题。
这里我定义的大数lnf是0x7FFFFFFF 也可以定义成别的,但要保证大(大到六亲不认的那种)
#include<bits/stdc++.h>
using namespace std;
#define lnf 0x7FFFFFFF
int imap[205][205],dis[205],vis[205];
int main()
{
int n,m,a,b,x,s,t,inext,imin;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
{
vis[i]=1;
dis[i]=lnf;
for(int j=0;j<n;j++)
imap[i][j]=lnf;
}
while(m--)
{
scanf("%d%d%d",&a,&b,&x);
imap[a][b]=min(imap[a][b],x);
imap[b][a]=imap[a][b];
}
scanf("%d%d",&s,&t);
vis[s]=0;
dis[s]=0;
while(s!=t)
{
imin=lnf;
for(int i=0;i<n;i++)
{
if(imap[s][i]!=lnf)
dis[i]=min(dis[i],dis[s]+imap[s][i]);
if(vis[i]&&dis[i]<imin)
{
inext=i;
imin=dis[i];
}
}
if(imin==lnf)
break;
s=inext;
vis[s]=0;
}
if(dis[t]==lnf)
printf("-1\n");
else
printf("%d\n",dis[t]);
}
return 0;
}