一,题目
二,翻译
贝西在田野里,想在农夫约翰叫醒她早晨挤奶之前,回到谷仓里尽可能多地睡觉。贝西需要美容睡眠,所以她想尽快回来。
农夫约翰的田地里有N(2<=N<=1000)个地标,唯一编号为1..N。地标1是谷仓;贝西整天站在其中的苹果树小树林是地标N。奶牛在田野中行走时,使用地标之间不同长度的T(1<=T<=2000)条双向奶牛道。贝西对自己的导航能力不太自信,所以一旦开始,她总是会一直沿着一条路走到终点。
给定地标之间的路径,确定贝西返回谷仓必须走的最短距离。保证存在某些此类路线。
输入
*第1行:两个整数:T和N
*第2..T+1行:每行将一条轨迹描述为三个空格分隔的整数。前两个整数是轨迹行进的界标。第三个整数是轨迹的长度,范围为1..100。
输出
*第1行:一个整数,即贝西从地标N到地标1所需的最小距离。
三,思路
说白了,就是找1到N的最短路,硬套最短路算法就行
四,代码
#include<algorithm>
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
#define INF 1e9+7
int maze[1005][1005]={0},dis[1005]={0},book[1005]={0};
int main()
{
int T,N;
cin>>T>>N;
memset(maze,INF,sizeof(maze));
for(int i=1;i<=T;++i)
{
int x,y,len;
cin>>x>>y>>len;
if(maze[x][y]>len) maze[x][y]=len,maze[y][x]=len;
}
for(int i=1;i<=N;++i)
dis[i]=maze[1][i];
book[1]=1,dis[1]=0;
for(int i=1;i<=N-1;++i)
{
int MIN=INF,flag=0;
for(int j=1;j<=N;++j)
if(dis[j]<MIN&&!book[j])
MIN=dis[j],flag=j;
book[flag]=1;
for(int j=1;j<=N;++j) dis[j]=min(dis[j],dis[flag]+maze[flag][j]);
}
cout<<dis[N];
return 0;
}