Til the Cows Come Home (USACO 2004 November)(Dijkstra算法)

简介: Til the Cows Come Home (USACO 2004 November)(Dijkstra算法)

   Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the morning milking. Bessie needs her beauty sleep, so she wants to get back as quickly as possible.


Farmer John's field has N (2 <= N <= 1000) landmarks in it, uniquely numbered 1..N. Landmark 1 is the barn; the apple tree grove in which Bessie stands all day is landmark N. Cows travel in the field using T (1 <= T <= 2000) bidirectional cow-trails of various lengths between the landmarks. Bessie is not confident of her navigation ability, so she always stays on a trail from its start to its end once she starts it.


Given the trails between the landmarks, determine the minimum distance Bessie must walk to get back to the barn. It is guaranteed that some such route exists.

Input

* Line 1: Two integers: T and N


* Lines 2..T+1: Each line describes a trail as three space-separated integers. The first two integers are the landmarks between which the trail travels. The third integer is the length of the trail, range 1..100.

Output

* Line 1: A single integer, the minimum distance that Bessie must travel to get from landmark N to landmark 1.

Sample Input

5 5

1 2 20

2 3 30

3 4 20

4 5 20

1 5 100

Sample Output

90

Hint

INPUT DETAILS:


There are five landmarks.


OUTPUT DETAILS:


Bessie can get home by following trails 4, 3, 2, and 1.


不错的一个模板题;


直接分析题目,说一下思路,就是第一主函数里面我们要先将距离进行初始化,然后在把每个边对应的距离赋值,后面就是一个定义由起点到目标点的小函数,然后就直接Dijkstra()在函数里面我们要用到一个标记,这个很重要可以防止前面的循环对后面影响,然后·第一步就是找一个连接起点最短的点然后标记让后面的计算中不能影响,否则会出现不必要的值,或者错乱,然后下一个代码就是找k下一个节点就是离k最短的那个点,然后就建立了一个完整的生态圈,最后打出dis[m];


下面是ac代码,关建点都有注释。

f58230e9f063709cf3167704f4efdf14.gif


有事你就q我;QQ2917366383


学习算法


额考虑到c语言好久没有写了就练习了一下,想看c++的可以找我。

#include<stdio.h>
#define maxn 0x3fffffff
int dis[1005],map[1005][1005];
void dk(int m)
{
  int p[1005]={0};//先全部初始化为0 
  p[1]=1;//自己到自己就是不行,标记他 
  int i,j,k,min; 
  for(int i=1;i<=m;i++)
  {
    min=maxn;//方便看 
    k=1;//怕出现特例 
    for(int j=1;j<=m;j++)
    if(!p[j]&min>dis[j])//标记大法,防止前面的循环影响后面的; 
    {
      min=dis[j];
      k=j;
    }//找到一个1连接的最短值 
    p[k]=1;//标记他,自己不能自己到自己 
    for(int j=1;j<=m;j++)
    {
      if(!p[j]&dis[j]>dis[k]+map[k][j])//相当于由前面的k接下一个节点 
      {
        dis[j]=dis[k]+map[k][j];//进行比较得到k下一个 节点的最短距离 
      }
    }
  }
  printf("%d",dis[m]);//听懂掌声 
 } 
int main() 
{
  int n,m,a,b,i,j,line;//定义部分 
  while(scanf("%d%d",&n,&m)!=EOF)//可以多次输入 测试数据 
  {
    for(int i=1;i<=m;i++)
    {
      map[i][i]=0;
      for(int j=1;j<i;j++)//细节哦,j<i,才能遍历哦(不遍历i=j) 
      map[i][j]=map[j][i]=maxn;//相当于把初始化最大,后面有用 
    }
    for(int i=1;i<=n;i++)//几个边 
    {
      scanf("%d%d%d",&a,&b,&line);//点和距离 
      if(line<map[a][b])//用了前面提到的maxn来变相赋值 
      map[a][b]=map[b][a]=line;//没有方向所以都要赋值 
    }
    for(int i=1;i<=m;i++)//接下来就是由1为出发点到点i都距离 
    dis[i]=map[1][i];
    dk(m);//下面就是考验思维了 
  }
}
相关文章
|
7月前
|
人工智能 算法 数据可视化
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-2
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-2
|
7月前
|
算法
最短路之Dijkstra算法
最短路之Dijkstra算法
64 0
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
92 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
7月前
|
存储 人工智能 算法
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-1
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-1
|
2月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
4月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
4月前
|
算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
103 0
|
5月前
|
算法
基于Dijkstra算法的最优行驶路线搜索matlab仿真,以实际城市复杂路线为例进行测试
使用MATLAB2022a实现的Dijkstra算法在城市地图上搜索最优行驶路线的仿真。用户通过鼠标点击设定起点和终点,算法规划路径并显示长度。测试显示,尽管在某些复杂情况下计算路径可能与实际有偏差,但多数场景下Dijkstra算法能找到接近最短路径。核心代码包括图的显示、用户交互及Dijkstra算法实现。算法基于图论,不断更新未访问节点的最短路径。测试结果证明其在简单路线及多数复杂城市路况下表现良好,但在交通拥堵等特殊情况下需结合其他数据提升准确性。
|
5月前
|
资源调度 算法 定位技术
|
5月前
|
算法 Java C++
《经典图论算法》迪杰斯特拉算法(Dijkstra)
这个是求最短路径的迪杰斯特拉算法,另外我还写了50多种《经典图论算法》,每种都使用C++和Java两种语言实现,熟练掌握之后无论是参加蓝桥杯,信奥赛,还是其他比赛,或者是面试,都能轻松应对。