Til the Cows Come Home

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.

 
题意:给你一个图,途中每一条边都带有权值(路径长度),求从1到n的最短路径。
思路:单元最短路问题,首先想到Dijkstra。在这里把最基础的Dij O(n^2)与邻接表存图、堆优化的Dij O((n+m)logn)作个比较。
ps:史上最坑题!没有之一!首先是题目和样例的t、n顺序不同很容易误导爆RE。。再一个就是重  边  问  题!基础Dij会WA。。这题还有数据范围也...总之还是先把基础打好。

 
基础Dij:贪心思想
Dijkstra 思路是维护一个集合 s ,集合内的点是已经确定最短路的点,可以视为一个大整体
每次操作找出距离这个集合源点最近的点(dis最小)加入集合中,
并确定它的最短路为它的上家的最短路+该边权值,存在 dis 中(松弛操作:更新该点与集合外直接相连点的dis)
这里通过b标记点是否存在于集合,n-1次操作即可,dis最终结果为各点与单源点之间的最短路径
 
ps:Dij不能跑有负权边的图和最长路(负权边可用spfa但不能处理负环,最长路的贪心是错的,可将边权值*-1转化为spfa求最短路),
Dij可通过priority_queue堆优化,每次pop弹出的点相当于加入集合的点,这里省去了扫最近点的时间

#include<stdio.h>
#include<string.h>
#include<limits.h> int a[][];
int dis[],b[];
int n; int min(int x,int y)
{
return x<y?x:y;
} void dij(int k)
{
int i,j,mind,minj;
memset(b,,sizeof(b));
for(i=;i<=n;i++){
dis[i]=INT_MAX;
}
dis[k]=;
for(i=;i<n;i++){
mind=INT_MAX;
for(j=;j<=n;j++){
if(!b[j]&&dis[j]<mind){
mind=dis[j];
minj=j;
}
}
b[minj]=;
for(j=;j<=n;j++){
if(!b[j]&&a[minj][j]>=){
dis[j]=min(dis[j],dis[minj]+a[minj][j]);
}
}
}
} int main()
{
int t,x,y,z;
memset(a,-,sizeof(a));
scanf("%d%d",&t,&n);
while(t--){
scanf("%d%d%d",&x,&y,&z);
if(a[x][y]!=-){
if(z<a[x][y]){
a[x][y]=z;
a[y][x]=z;
}
}
else{
a[x][y]=z;
a[y][x]=z;
}
}
dij();
printf("%d\n",dis[n]);
return ;
}

优化Dij:

#include<stdio.h>
#include<string.h>
#include<limits.h>
#include<vector>
#include<queue>
using namespace std; struct Node{
int v,w;
friend bool operator<(Node a,Node b)
{
return a.w>b.w;
}
}node; vector<Node> a[];
int dis[];
int n; void dij(int k)
{
int v1,v2,i;
priority_queue<Node> q;
dis[k]=;
node.w=;
node.v=k;
q.push(node);
while(q.size()){
v1=q.top().v;
q.pop();
for(i=;i<a[v1].size();i++){
v2=a[v1][i].v;
if(dis[v2]>dis[v1]+a[v1][i].w){
dis[v2]=dis[v1]+a[v1][i].w;
node.w=dis[v2];
node.v=v2;
q.push(node);
}
}
}
} int main()
{
int t,x,y,z,i;
scanf("%d%d",&t,&n);
for(i=;i<=n;i++){
a[i].clear();
dis[i]=INT_MAX;
}
while(t--){
scanf("%d%d%d",&x,&y,&z);
node.w=z;
node.v=y;
a[x].push_back(node);
node.v=x;
a[y].push_back(node);
}
dij();
printf("%d\n",dis[n]);
return ;
}

POJ 2387 Til the Cows Come Home Dijkstra求最短路径的更多相关文章

  1. Poj 2387 Til the Cows Come Home(Dijkstra 最短路径)

    题目:从节点N到节点1的求最短路径. 分析:这道题陷阱比较多,首先是输入的数据,第一个是表示路径条数,第二个是表示节点数量,在 这里WA了四次.再有就是多重边,要取最小值.最后就是路径的长度的最大值不 ...

  2. poj 2387 Til the Cows Come Home(dijkstra算法)

    题目链接:http://poj.org/problem?id=2387 题目大意:起点一定是1,终点给出,然后求出1到所给点的最短路径. 注意的是先输入边,在输入的顶点数,不要弄反哦~~~ #incl ...

  3. POJ 2387 Til the Cows Come Home (Dijkstra)

    传送门:http://poj.org/problem?id=2387 题目大意: 给定无向图,要求输出从点n到点1的最短路径. 注意有重边,要取最小的. 水题..对于无向图,从1到n和n到1是一样的. ...

  4. POJ 2387 Til the Cows Come Home (图论,最短路径)

    POJ 2387 Til the Cows Come Home (图论,最短路径) Description Bessie is out in the field and wants to get ba ...

  5. POJ.2387 Til the Cows Come Home (SPFA)

    POJ.2387 Til the Cows Come Home (SPFA) 题意分析 首先给出T和N,T代表边的数量,N代表图中点的数量 图中边是双向边,并不清楚是否有重边,我按有重边写的. 直接跑 ...

  6. POJ 2387 Til the Cows Come Home

    题目链接:http://poj.org/problem?id=2387 Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K ...

  7. POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)

    传送门 Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 46727   Acce ...

  8. 怒学三算法 POJ 2387 Til the Cows Come Home (Bellman_Ford || Dijkstra || SPFA)

    Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33015   Accepted ...

  9. POJ 2387 Til the Cows Come Home (最短路 dijkstra)

    Til the Cows Come Home 题目链接: http://acm.hust.edu.cn/vjudge/contest/66569#problem/A Description Bessi ...

随机推荐

  1. 文件查找工具Everything小工具的使用

    Everything 小工具的使用: 首先它是一款基于名称实时定位文件和目录的搜索工具,有以下几个优点: 快速文件索引 快速文件搜索 较低资源占用 轻松分享文件索引 实时跟踪文件更新 通过使用ever ...

  2. matlab实战中一些重要的函数总结

    这段时间看了一些大型的matlabproject文件(如:faster r-cnn),对于project中常常要用到的一些函数进行一个总结. 1.路径问题. 这主要涵括文件路径的包括和组合. curd ...

  3. Yii 框架 URL路径简化

    Yii 框架的訪问地址若不简化会让人认为非常繁琐.未简化的地址一般格式例如以下: http://localhost:80/test/index.php?r=xxx/xxx/xxx 若是带有參数会更复杂 ...

  4. P5111 zhtobu3232的线段树

    P5111 zhtobu3232的线段树 维护左子树右子树的贡献和跨区间贡献 #include<bits/stdc++.h> using namespace std; typedef lo ...

  5. HDU 2037 今年暑假不AC ( 起始与终止时间 【贪心】)

    今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  6. JAVA- 成员变量与局部变量的区别

    成员变量与局部变量的区别 成员变量是定义在方法之外,类之内的局部变量是定义在方法之内的. 作用上的区别: 1.成员变量的作用是用于描述一类事物的公共属性的. 2.局部变量的作用就是提供一个变量给方法内 ...

  7. listen 66

    Frog Species Found in Big Apple Scientists discover new species all the time—on the order of 15,000 ...

  8. C++中的宏和const

    在C语言中使用const来定义一个变量,可以通过变量类型的指针形式来进行修改,而C++中增强了这种表现形式,使得即使通过类型变量指针也不能对变量进行修改. 在C++中const和宏是有区别的. con ...

  9. 集训Day2

    雅礼集训2017Day2 T1 给你一个水箱,水箱里有n-1个挡板,水遵循物理定律 给你m个条件,表示第i个格子上面y+1高度的地方有或没有水 现在给你无限的水从任意地方往下倒,问最多满足多少条件 n ...

  10. COGS 2581 无聊的会议V2

    传送 题目大意 给定一个长为\(n\)的序列,定义\(y\)在三元对\((x,y,z)\)中成为中心轴当且仅当同时满足:\(a_x = a_y = a_z,y-x=z-y,x<y<z\)对 ...