POJ 2387 Bellman双重边
来源:互联网 发布:淘宝泳衣模特是谁 编辑:程序博客网 时间:2024/05/21 09:33
Til the Cows Come Home
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 44129 Accepted: 15001
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 44129 Accepted: 15001
Description
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.
关键是多重边,即是双向的,长度不等,用Bellman算法处理比较方便
如:
5 5
2 4 20
2 3 30
3 4 20
4 2 10
1 5 100
dis[4] > dis[2] + 2-4,更新
且dis[2] > dis[4] + 4-2 更新
1点到2点的距离也可以从4-2来松弛
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 4000;const int INF = 99999999;int main(){ int dis[maxn],bak[maxn],i,j,n,m,u[2*maxn],v[2*maxn],w[2*maxn],check,flag; scanf("%d%d",&m,&n); for(i=1;i<=m;i++) scanf("%d%d%d",&u[i],&v[i],&w[i]); for(i=1;i<=n;i++) dis[i]=INF; dis[1]=0; for(j=1;j<=n-1;j++){ check=0; for(i=1;i<=m;i++){ if(dis[v[i]] > dis[u[i]] +w[i] ){ dis[v[i]] = dis[u[i]]+ w[i]; check = 1; } //对所有的单边遍历都不能缩小,那最多边的松弛更不能松弛了 if(dis[u[i]]>dis[v[i]]+w[i]){ dis[u[i]] = dis[v[i]]+w[i]; check = 1; } } if(check==0) break; } printf("%d",dis[n]); return 0; }
再附上别人的Dijkstra算法做的:
#include <iostream>using namespace std;#define inf 1<<29#define MAXV 1005int map[MAXV][MAXV];int n,m;void dijkstra(){int i,j,min,v;int d[MAXV];bool vis[MAXV];for(i=1;i<=n;i++){vis[i]=0;d[i]=map[1][i];}for(i=1;i<=n;i++){min=inf;for(j=1;j<=n;j++)if(!vis[j] && d[j]<min){v=j;min=d[j];}vis[v]=1;for(j=1;j<=n;j++)if(!vis[j] && d[j]>map[v][j]+d[v])d[j]=map[v][j]+d[v];}printf("%d\n",d[n]);}int main(){int i,j,a,b,c;while(~scanf("%d%d",&m,&n)){for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(i==j)map[i][i]=0;else map[i][j]=map[j][i]=inf;for(i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);if(map[a][b]>c) map[a][b]=map[b][a]=c; //关键处理,存下最小的边,DJ算法把有向图转换成无向图处理}dijkstra();}return 0;}
0 0
- POJ 2387 Bellman双重边
- poj 2387 bellman-ford裸题
- POJ-2253 Frogger-寻找最长边-bellman
- POJ 3170--双重BFS
- poj-3259 bellman-ford
- poj 3259 bellman-ford
- poj 1860 bellman-ford
- poj 1932 bellman
- poj 2240 bellman-ford
- poj 1847 bellman-ford
- poj 2240 bellman
- poj 1860 bellman 求正环
- POJ-2240 -Arbitrage(Bellman)
- POJ 3259 Wormholes (Bellman)
- poj 1860 Bellman-Ford
- poj 1860 (bellman-ford)
- poj 3259 Wormholes (bellman)
- poj 2240 Bellman-ford
- org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList o
- 每个程序员1小时内必须解决的5个编程问题
- 想要裸辞不掉价,一定要这么做!
- Go语言编程(三)之过过瘾
- 引领新未来SOA服务框架,未来发展的方向
- POJ 2387 Bellman双重边
- win10系统免费激活
- 模型基图像编码
- sg函数+nim博弈+打表_______A Simple Nim(hdu 5795 2016多校第六场)
- Qt标准对话框实现
- UIAlertController + UIPickerView完美结合
- zlib
- (LeetCode)Rotate Array --- 逆置数组
- Android Proguard混淆器