1. 程式人生 > >CCF之無線網路(java)

CCF之無線網路(java)

試題編號: 201403-4
試題名稱: 無線網路
時間限制: 1.0s
記憶體限制: 256.0MB
問題描述: 問題描述   目前在一個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。
  除此以外,另有 m 個可以擺放無線路由器的位置。你可以在這些位置中選擇至多 k 個增設新的路由器。
  你的目標是使得第 1 個路由器和第 2 個路由器之間的網路連線經過儘量少的中轉路由器。請問在最優方案下中轉路由器的最少個數是多少? 輸入格式   第一行包含四個正整數 n,m,k,r。(2 ≤ n ≤ 100,1 ≤ k ≤ m ≤ 100, 1 ≤ r ≤ 108
)。
  接下來 n 行,每行包含兩個整數 xi 和 yi,表示一個已經放置好的無線 路由器在 (xi, yi) 點處。輸入資料保證第 1 和第 2 個路由器在僅有這 n 個路由器的情況下已經可以互相連線(經過一系列的中轉路由器)。
  接下來 m 行,每行包含兩個整數 xi 和 yi,表示 (xi, yi) 點處可以增設 一個路由器。
  輸入中所有的座標的絕對值不超過 108,保證輸入中的座標各不相同。 輸出格式   輸出只有一個數,即在指定的位置中增設 k 個路由器後,從第 1 個路 由器到第 2 個路由器最少經過的中轉路由器的個數。 樣例輸入 5 3 1 3
0 0
5 5
0 3
0 5
3 5
3 3
4 4
3 0 樣例輸出 2

解題程式碼(java):

import java.util.ArrayList;  
import java.util.LinkedList;  
import java.util.List;  
import java.util.Queue;  
import java.util.Scanner;  
  
public class Main {  
    static class P  
    {  
        int x;  
        int y;  
    }  
   
    public static List<P> p = new ArrayList<P>();  
    public static void main(String[] args) {  
        boolean [][] map = new boolean[205][205];  
        long [][]d = new long[205][205];  
        boolean [][]vis = new boolean[205][205];  
        Queue<P> q = new LinkedList<P>();  
          
        Scanner in = new Scanner(System.in);  
        int n = in.nextInt();  
        int m = in.nextInt();  
        int k = in.nextInt();  
        long r =in.nextLong();  
        long [][]arr = new long[n+m][2];  
          
         for(int i=0;i<n+m;++i)  
         {  
             long a = in.nextLong();  
             long b = in.nextLong();  
             arr[i][0] = a;  
             arr[i][1] = b;  
         }  
         in.close();  
         for(int i=0;i<n+m;++i)  
         {  
             for(int j=i+1;j<n+m;++j)  
             {  
                 if((arr[i][0]-arr[j][0])*(arr[i][0]-arr[j][0])+(arr[i][1]-arr[j][1])*(arr[i][1]-arr[j][1])<=r*r)  
                 {  
                     map[i][j] = true;  
                     map[j][i] = true;  
                 }  
                   
                   
             }  
              
         }  
           
         for(int i = 0;i<205;i++)  
             for(int j = 0;j<205;j++)  
                 d[i][j]=0x3f3f3f3f;  
           
            d[0][0]=0;  
            vis[0][0]=true;  
            P p = new P();  
             
            p.x=0;  
            p.y=0;  
            q.add(p);  
            while(!q.isEmpty())  
            {  
                P s = new P();  
                  
                s = q.remove();  
                vis[s.x][s.y]=false;  
                for(int i=0;i<n+m;++i)  
                {  
                     P tem = new P();  
                    if(map[s.x][i])  
                    {  
                        tem.x=i;  
                        tem.y=s.y;  
                        if(i>=n)   
                            ++tem.y;  
                        if(tem.y<=k&&d[tem.x][tem.y]>d[s.x][s.y]+1)  
                        {  
                            d[tem.x][tem.y]=d[s.x][s.y]+1;  
                            if(!vis[tem.x][tem.y])  
                            {  
                                vis[tem.x][tem.y]=true;  
                                q.add(tem);  
                            }  
                        }  
                    }  
                }  
            }  
            long ans=0x3f3f3f3f;  
            for(int i=0;i<=k;i++) ans=Math.min(ans,d[1][i]);  
            System.out.printf("%d\n",ans-1);  
        }   
           
    
  
    }