题目大意:一个人想从自己所在的点(N)以最快的方式走到1点,每组案例给出T个关系,(1 2 5)即代表1点和2点距离是5。一共有T组这样的关系。下面让我们求出从N点到1点的最短距离。
大致想法:用Dijkstra算法,说这个你也并不认识他。我觉得这种算法就是在求最小生成树的基础上稍稍改动了一下下。就是再更新的时候有点区别。求最小生成树的时候是拿新的边(其它点到新找出的节点的距离,不包括已经确定的节点)与之前节点的边进行比较。而最短路径是拿新边加上之前的构成最小生成树的所有边与之前的边的和比较,保留较小的到达指定地点即可跳出循环,输出结果。
代码如下:(重点的地方有解释哟)
#include<cstdio>
int map[10000][10000],d[10000],n,maxx=100000;
void dijkstra(int v)
{
int i,j;
bool s[10000]={false};
for(i=1;i<=n;i++)
d[i]=map[v][i];
d[v]=0;s[v]=true;
for(i=1;i<n;i++)
{
int temp=maxx;
int u=v;
for(j=1;j<=n;j++)
if((!s[j])&&(d[j]<temp))//找出最小的那条边
{
u=j;
temp=d[j];
}
s[u]=true;
for(j=1;j<=n;j++)
if((!s[j])&&(map[u][j]<maxx)&&(d[u]+map[u][j])<d[j])//没访问过那个节点并且找到的最新的路径比原先的小就要进行更新
d[j]=d[u]+map[u][j];
}
}
int main()
{
int t,a,b,c;
scanf("%d%d",&t,&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=maxx;
while(t--)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]&&c>=map[a][b])continue;//为避免重边,就是两个点之间可能不止一条边,我们应当取最小的那条并保存
map[a][b]=map[b][a]=c;
}
dijkstra(n);
printf("%d\n",d[1]);
return 0;
}