无线网络

来源:互联网 发布:每天一个linux命令 编辑:程序博客网 时间:2024/04/28 08:48
试题名称: 无线网络 
时间限制: 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
样例输出


用数据结构的最短路径迪杰斯特拉算法解决即可。审题不太仔细导致一直出错。第一个是起点,第二个就是终点了。


[cpp] view plaincopy
  1. #include<iostream>  
  2. #include<queue>  
  3. using namespace std;  
  4.   
  5. class Router{  
  6. public:  
  7.     int x;  
  8.     int y;  
  9.     bool v;  
  10.     Router(){  
  11.         x = -1;  
  12.         y = -1;  
  13.         v = false;  
  14.     }  
  15. };  
  16.   
  17. int path[200][200] = {0};  
  18. int len[200]={0};  
  19. int dist[200]={0};  
  20. int canput[200] = {0};  
  21.   
  22. bool inRange(long long x, long long y , long long r){  
  23.     return x * x + y * y <= r * r;  
  24. }  
  25.   
  26. int abs(int n){     //取绝对值  
  27.     return (n^(n>>31))-(n>>31);  
  28. }  
  29.   
  30.   
  31.   
  32. int main(){  
  33.     int n,m,k,r,x,y,i,j,sum,index,cp;  
  34.     queue<int> q;  
  35.     cin>>n>>m>>k>>r;  
  36.     sum = n+m;  
  37.     Router *put = new Router[sum];  
  38.     for(i = -1 ; ++i < sum;){  
  39.         cin>>x>>y;  
  40.         put[i].x = x;  
  41.         put[i].y = y;  
  42.     }  
  43.     for(i = -1;++i < sum;){  
  44.         for(j= i;++j < sum;){  
  45.             if(inRange(abs(put[i].x - put[j].x),abs(put[i].y-put[j].y),r)){  
  46.                 path[i][len[i]++] = j;  
  47.                 path[j][len[j]++] = i;  
  48.             }  
  49.         }  
  50.     }  
  51. /*  cout<<"终点:"<<1<<endl; 
  52.     for(i = -1;++i<sum;){ 
  53.         cout<<i<<": "; 
  54.         for(j = -1;++j<len[i]-1;){ 
  55.             cout<<path[i][j]<<" "; 
  56.         } 
  57.         if(len[i]>0){ 
  58.             cout<<path[i][j]; 
  59.         } 
  60.         cout<<endl; 
  61.     }*/  
  62.     q.push(0);  
  63. /*  for(j=-1;++j<sum-1;){ 
  64.         cout<<j<<" "; 
  65.     } 
  66.     cout<<j<<endl;*/  
  67.     while(!q.empty()){  
  68.         index = q.front();  
  69.         q.pop();  
  70.         put[index].v = true;  
  71.         for(i=-1;++i<len[index];){  
  72.             cp = canput[path[index][i]];  
  73.             if(path[index][i]>=n){  
  74.                 cp ++;  
  75.             }  
  76.             if(cp<=k && (dist[path[index][i]]==0 || dist[path[index][i]] > dist[index] + 1)){  
  77.                 dist[path[index][i]] = dist[index]+1;  
  78.                 if(put[path[index][i]].v == false){  
  79.                     q.push(path[index][i]);  
  80.                 }  
  81.             }  
  82.         }  
  83.     /*  cout<<index<<":"<<endl; 
  84.         for(i=-1;++i<sum-1;){ 
  85.             cout<<dist[i]<<" "; 
  86.         } 
  87.         cout<<dist[i]<<endl;*/  
  88.     }  
  89. /*  for(j=-1;++j<sum-1;){ 
  90.         cout<<canput[j]<<" "; 
  91.     } 
  92.     cout<<canput[j]<<endl;*/  
  93.     cout<<dist[1]-1<<endl;  
  94.     delete[]put;  
  95.     return 0;  
  96. }  
0 0