Advertisement
saske_7

uva_road_construction.cpp

Nov 17th, 2017
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std ;
  4.  
  5. #define M 1000
  6. #define pii pair<int , int >
  7. #define mp make_pair
  8. #define pf printf
  9. #define sf scanf
  10. #define sf1(a ) scanf("%d",&a)
  11. #define pb push_back
  12. #define sf2(a, b) scanf("%d%d",&a ,&b)
  13. #define rep(i,n) for(i = 1 ; i<= n ;i++ )
  14. #define sq(x)  x*x
  15. const double mx = 1000000000;
  16. struct _cv{
  17. double cost ,len ;
  18. int x, y ;
  19.  
  20. };
  21.  
  22. struct _node{
  23. int x, y ;
  24.  
  25. };
  26.  
  27. vector<_cv > cv;
  28. vector<_node > node;
  29.  
  30. bool comp(_cv p , _cv q){
  31.   if(!(p.cost - q.cost <= .0000001 && q.cost - p.cost <= .0000001))
  32.     return p.cost > q.cost ;
  33.  
  34.   else if((p.len  - q.len  <= .0000001 && q.len - p.len <= .0000001))
  35.     return p.len < q.len ;
  36.   else if(p.x != q.x) return p.x < q.x ;
  37.   else return p.y < q.y;
  38.  
  39. }
  40.  
  41. map<pii , int> mm;
  42. map<pii , int> track ;
  43. double arr[M][M];
  44.  
  45. void warshall(int num ){
  46. int i  , j , k;
  47.   rep(k , num ) rep(i , num ) rep(j ,num ){
  48.     if(arr[i][k] + arr[j][k] < arr[i][j])
  49.       arr[i][j] = arr[i][k] + arr[j][k];
  50.  
  51.   }
  52.  
  53. return ;
  54. }
  55.  
  56.  
  57.  
  58. int main(){
  59. //   freopen("in.txt","r",stdin);
  60.   // freopen("out.txt","w",stdout);
  61.  
  62.   int i, j,k , n ,m;
  63.   while(scanf("%d%d",&n ,&m)){
  64.     if(n== 0 && m ==0) break ;
  65.     //m.clear();
  66.     _node var; node.pb(var);
  67.     int num ; num =  n ;
  68.     rep(i, M-1  )rep(j , M -1) arr[i][j] =  mx;
  69.     while( n--){
  70.         _node var;
  71.         double u , v ;
  72.         scanf("%lf%lf",&u , &v );
  73.         var.x = u ;
  74.         var.y = v ;
  75.  
  76.         node.pb(var );
  77.  
  78.     }
  79.  
  80.     while(m--){
  81.         double  rc ;
  82.         int u,v  ;
  83.         scanf("%d%d",&u , &v);
  84.         mm[make_pair(u,v)] =1 ;
  85.         mm[mp(v, u )]=1 ;
  86.  
  87.         rc = (double)sqrt(sq(node[u].x - node[v].x ) + sq(node[u].y - node[v].y) );
  88.  
  89.     arr[u][v] =  arr[v][u] = rc ;
  90.     }
  91.     rep(i ,M-1 ) arr[i][i] =  0;
  92.     warshall(num);
  93.  
  94.     rep(i , num ){
  95.       for(j =  i+1 ;j <= num ;j++){
  96.         _cv var ;
  97.         if(mm.find(mp(i,j ))== mm.end()){
  98.             double _cost ;
  99.             _cost = (double )sqrt(sq(node[i].x- node[j].x) +sq(node[i].y - node[j].y ));
  100.             var.len = _cost ;
  101.             var.cost = arr[i][j] - _cost ;
  102.             var.x = i ;
  103.             var.y = j ;
  104.             cv.pb(var);
  105.            }
  106.         }
  107.       }
  108.     // end of n2
  109.  
  110. sort(cv.begin() , cv.end() , comp);
  111.     if(cv[0].cost <= 1.0)
  112.       pf("No road required\n");
  113.     else pf("%d %d\n", cv[0].x,cv[0].y  );
  114.  
  115.   }
  116.  
  117.  
  118. return 0 ;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement