acmPOJ--3615
来源:互联网 发布:手机淘宝怎么看优惠券 编辑:程序博客网 时间:2024/04/30 14:29
Problem Description
Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the gang are practicing jumping over hurdles. They are getting tired, though, so they want to be able to use as little energy as possible to jump over the hurdles.
Obviously, it is not very difficult for a cow to jump over several very short hurdles, but one tall hurdle can be very stressful. Thus, the cows are only concerned about the height of the tallest hurdle they have to jump over.
The cows’ practice room has N (1 ≤ N ≤ 300) stations, conveniently labeled 1..N. A set of M (1 ≤ M ≤ 25,000) one-way paths connects pairs of stations; the paths are also conveniently labeled(标注) 1..M. Path i travels from station Si to station Ei and contains exactly one hurdle(障碍) of height Hi (1 ≤ Hi ≤ 1,000,000). Cows must jump hurdles in any path they traverse(穿过).
The cows have T (1 ≤ T ≤ 40,000) tasks to complete. Task i comprises(包含) two distinct(明显的) numbers, Ai and Bi (1 ≤ Ai ≤ N; 1 ≤ Bi ≤ N), which connote(意味着) that a cow has to travel from station Ai to station Bi (by traversing(穿越) over one or more paths over some route(按某路线发送)). The cows want to take a path the minimizes(使减到最少) the height of the tallest hurdle(障碍) they jump over when traveling from Ai to Bi . Your job is to write a program that determines the path whose tallest hurdle is smallest and report that height.
Input
- Line 1: Three space-separated integers(整数): N, M, and T
- Lines 2..M+1: Line i+1 contains three space-separated integers(整数): Si , Ei , and Hi
- Lines M+2..M+T+1: Line i+M+1 contains two space-separated integers(整数) that describe task i: Ai and Bi
Output
- Lines 1..T: Line i contains the result for task i and tells the smallest possible maximum height necessary to travel between the stations. Output(输出) -1 if it is impossible to travel between the two stations.
题意:
奶牛接任务从一个点A去点B,可能有多条路径(A直接到B,或者A到C在到B等等),点与点直接隔一个栏杆需要牛跨过去,帮牛找一条从点A到点B的路径,这条路径牛所要跨的栏的最高高度是所有路径中最低的。
思路:
栏高度即为各边的权,用Dijkstra算法,数组dist存放起始点到各点路径中栏高的最大值,先遍历中间点C,看有没有起始点A到C的权比A到B的小,有则dist中存A到C和C到B的最大值,没有则存A直接到B的值。循环迭代。
import java.util.Scanner;public class Main { class graph{ int [][] adj; Path dist[]; int max[]; void setV0(int v0){ dist[v0].length = 0; dist[v0].prevex = 0; adj[v0][v0] = 1; } public graph(int n) { // TODO 自动生成的构造函数存根 adj = new int[n][n]; max = new int[n]; for(int i =0;i<n;i++){ for(int j=0;j<n;j++){ if(i!=j){ adj[i][j]=Integer.MAX_VALUE; }else{ adj[i][j]=0; } } } } } class Path{ int length; int prevex; public Path() { // TODO 自动生成的构造函数存根 } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Main demo = new Main(); int N,M,T; int S,E,H; int i,j,x,y; int A,B; int mv; N = scanner.nextInt(); M = scanner.nextInt(); T = scanner.nextInt(); /** * 生成题目给出的邻接矩阵 */ graph gdemo = demo.new graph(N);// int [][]graph = new int[N][N]; for(i=0;i<N;i++){ for(j=0;j<N;j++){ if(i!=j){ gdemo.adj[i][j] = Integer.MAX_VALUE; }else{ gdemo.adj[i][j] = 0; } } } gdemo.dist = new Path[N]; for(j=0;j<N;j++){ gdemo.dist[j] = demo.new Path(); } for(i=0;i<M;i++){ S = scanner.nextInt(); E = scanner.nextInt(); H = scanner.nextInt(); gdemo.adj[S-1][E-1] = H; } /** * 计算ab之间路径最低高度 */ for(i=0;i<T;i++){ A = scanner.nextInt(); B = scanner.nextInt(); /** * 初始化矩阵 */// graph gdemo = demo.new graph(N);// for(x=0;x<N;x++){// for(y=0;y<N;y++){// gdemo.adj[x][y] = graph[x][y];// }// } for(x=0;x<N;x++){ gdemo.adj[x][x] = 0; } /** * 设置出发点a */ gdemo.setV0(A-1); /** * 存放初始状态A点一步到其余各点距离的数组dist */ for(j=0;j<N;j++){ //存放第A点一步到其余各点距离的数组dist gdemo.dist[j].length = gdemo.adj[A-1][j]; if(gdemo.dist[j].length!=Integer.MAX_VALUE){ gdemo.dist[j].prevex=A-1; } } for(j=0;j<N;j++){ mv = -1; for(x=0;x<N;x++){ if(gdemo.adj[x][x]==0&&gdemo.dist[x].length<gdemo.dist[B-1].length){ mv = x; } } if(mv == -1){ break; } gdemo.adj[mv][mv] = 1; for(y=0;y<N;y++){ if(gdemo.adj[y][y] == 0&& gdemo.dist[mv].length+gdemo.adj[mv][y]<Integer.MAX_VALUE){ if(gdemo.dist[mv].length+gdemo.adj[mv][y]>0){ if(gdemo.dist[y].length>gdemo.adj[mv][y]){ gdemo.dist[y].length = Math.max(gdemo.dist[mv].length, gdemo.adj[mv][y]); gdemo.dist[y].prevex = mv; }// gdemo.dist[y].length = gdemo.dist[mv].length + gdemo.adj[mv][y]; } } } } if(gdemo.dist[B-1].length!=Integer.MAX_VALUE){ System.out.println(gdemo.dist[B-1].length); }else { System.out.println(-1); } } }}
- acmPOJ--3615
- ACMPOJ--1125
- acmPOJ--1847
- acmPOJ--1502
- ACMpoj 1953斐波拉契数列
- pku 3615
- POJ 3615
- POJ 3615
- (3615)POJ
- poj 3615
- POJ 3615 Cow Hurdles
- poj 3615 Cow Hurdles
- 【floyd】poj 3615
- poj 3615 Cow Hurdles
- poj 3615flody
- poj 3615 Cow Hurdles
- poj 3615 Cow Hurdles
- poj 3615 Cow Hurdles
- SQL Server之存储过程基础知识
- xcode编程中使用使用了DOUAudioStreamer这个第三方遇到的问题及其解决方法
- Java中泛型的理解(二)
- Codeforces Round #324 (Div. 2) B. Kolya and Tanya(组合数学)
- Handler自我理解
- acmPOJ--3615
- python爬虫程序,由根目录一直爬各个网址
- 女程序猿到此一游
- 连接数据库
- java之-命令模式
- 微信网页开发问题汇总
- 分布式RAM
- 第三十篇:控制器的生成与多控制器的管理
- 父类子类之间的一个经典题目(有关成员变量何时赋值和在哪里赋值的问题)