题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1598
find the most comfortable road
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2718 Accepted Submission(s): 1153
Problem Description
XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ),
但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
Input
输入包括多个测试实例,每个实例包括:
第一行有2个正整数n (1<n<=200)和m (m<=1000),表示有N个城市和M条SARS。
接下来的行是三个正整数StartCity,EndCity,speed,表示从表面上看StartCity到EndCity,限速为speedSARS。speed<=1000000
然后是一个正整数Q(Q<11),表示寻路的个数。
接下来Q行每行有2个正整数Start,End, 表示寻路的起终点。
第一行有2个正整数n (1<n<=200)和m (m<=1000),表示有N个城市和M条SARS。
接下来的行是三个正整数StartCity,EndCity,speed,表示从表面上看StartCity到EndCity,限速为speedSARS。speed<=1000000
然后是一个正整数Q(Q<11),表示寻路的个数。
接下来Q行每行有2个正整数Start,End, 表示寻路的起终点。
Output
每个寻路要求打印一行,仅输出一个非负整数表示最佳路线的舒适度最高速与最低速的差。如果起点和终点不能到达,那么输出-1。
Sample Input
4 4 1 2 2 2 3 4 1 4 1 3 4 2 2 1 3 1 2
Sample Output
1 0
import java.io.*; import java.util.*; public class Main { int MIN=Integer.MAX_VALUE; int M=205,n,m; int patten[]=new int[M]; Node node[]; public static void main(String[] args) { new Main().work(); } void work(){ Scanner sc=new Scanner(new BufferedInputStream(System.in)); while(sc.hasNext()){ n=sc.nextInt(); m=sc.nextInt(); init(); node=new Node[m]; for(int i=0;i<m;i++){ int a=sc.nextInt(); int b=sc.nextInt(); int c=sc.nextInt(); node[i]=new Node(a,b,c); union(a,b); } Arrays.sort(node);//按权值排序 int q=sc.nextInt(); for(int i=0;i<q;i++){ int a=sc.nextInt(); int b=sc.nextInt(); getDistance(a,b); } } } //获取最短距离 void getDistance(int a,int b){ int min=MIN; for(int i=0;i<m;i++){ init(); for(int j=i;j<m;j++){ union(node[j].a,node[j].b); if(find(a)==find(b)) min=Math.min(min,node[j].c-node[i].c); } } if(min!=MIN) System.out.println(min); else System.out.println(-1); } // 合并 void union(int a,int b){ int pa=find(a); int pb=find(b); if(pa==pb) return; patten[pa]=pb; } //查找 int find(int x){ if(patten[x]==x) return x; patten[x]=find(patten[x]); return patten[x]; } //初始化 void init(){ for(int i=0;i<=n;i++){ patten[i]=i; } } class Node implements Comparable<Node>{ int a; int b; int c; Node(int a,int b,int c){ this.a=a; this.b=b; this.c=c; } public int compareTo(Node o) { return this.c>o.c?1:-1; } } }
作者:long71751380 发表于2013-8-20 13:35:45 原文链接
阅读:45 评论:0 查看评论