在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
输入保证至少存在1条商店到赛场的路线。
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
3 2
呐.重新温习一遍,都忘记了=。=
要注意的是for循环是从0开始还是从1开始是根据题目给出地点的编号决定的
解题思路:
Dijkstra模板题。
Dijkstra的大致思想是:
从起点出发,不断更新能够到达的点的最短距离dis.
每扩展一个点就重新更新下其他所有点到起点的最短距离dis,这个过程就是“松弛”
AC代码:
#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
int mp[1010][1010],dis[1010],book[1010],n,m;
void dijkstra()
{
for(int i=1;i<=n;i++)
{
dis[i]=mp[1][i];
}
for(int i=1;i<=n-1;i++)//找n-1轮
{
int minn=INF,u;
for(int j=1;j<=n;j++)//找与上一个点最近的点
{
if(book[j]==0&&dis[j]<minn)
{
minn=dis[j];
u=j;
}
}
book[u]=1;
for(int j=1;j<=n;j++)//找着最近的点后通过这个最近的点更新其余的点到起点的距离
{
if(book[j]==0&&dis[u]+mp[u][j]<dis[j])//book[j]==0和dis[j]<INF看心情写吧= =
{
dis[j]=dis[u]+mp[u][j];
}
}
}
printf("%d\n",dis[n]);
}
int main()
{
while(~scanf("%d%d",&n,&m)&&n+m)
{
for(int i=1;i<=n;i++)//下标从0还是1开始由题目的标号决定
{
for(int j=1;j<=n;j++)//如果是0建议都从0开始计数,是1则1
{
if(i==j) mp[i][j]=0;
else mp[i][j]=INF;
}
}
memset(book,0,sizeof(book));
int u,v,w;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
if(w<mp[u][v]) mp[u][v]=mp[v][u]=w;
}
dijkstra();//这道题固定起点为1,也可在函数里自定义起点
}
return 0;
}