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是雙向的)。
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, 表示尋路的起終點。
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; } } } 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; } } }