najimCseJu

USACO 2014 January Contest, Silver Problem 2. Cross Country

Nov 20th, 2017
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define Mx 510
  4. struct Edge
  5. {
  6.     int ux,uy,vx,vy,w,val;
  7.     Edge() {}
  8.     Edge(int _ux,int _uy,int _vx,int _vy,int _w)
  9.     {
  10.         ux = _ux;
  11.         uy = _uy;
  12.         vx = _vx;
  13.         vy = _vy;
  14.         w = _w;
  15.     }
  16. };
  17. int grid[Mx][Mx];
  18. bool f[Mx][Mx];
  19. vector<Edge>Edges;
  20. int parent[Mx][Mx];
  21. int N,M;
  22. void init()
  23. {
  24.     memset(grid,0,sizeof grid);
  25.     memset(f,0,sizeof f);
  26.     memset(parent,0,sizeof parent);
  27.     Edges.clear();
  28. }
  29.  
  30.  
  31. bool comp(Edge e1,Edge e2)
  32. {
  33.     return e1.w < e2.w;
  34. }
  35.  
  36. int find_parent(int x,int y)
  37. {
  38.     int c = x*1000 + y;
  39.     if(parent[x][y]==c)return c;
  40.     int p = parent[x][y];
  41.     return parent[x][y] = find_parent(p/1000,p%1000);
  42. }
  43.  
  44. int main()
  45. {
  46.     ios_base::sync_with_stdio(false);
  47.     cin.tie(NULL);
  48.     while(cin >> N >> M)
  49.     {
  50.         init();
  51.         for(int i=0; i<N; i++)
  52.         {
  53.             for(int j=0; j<M; j++)
  54.             {
  55.                 cin >> grid[i][j];
  56.                 parent[i][j] = i*1000 + j;
  57.             }
  58.         }
  59.         int total_one = 0;
  60.  
  61.         for(int i=0; i<N; i++)
  62.         {
  63.             for(int j=0; j<M; j++)
  64.             {
  65.                 cin >> f[i][j];
  66.                 if(f[i][j]==1)total_one++;
  67.             }
  68.         }
  69.  
  70.         int dx[]= {0,0,1,-1};
  71.         int dy[]= {1,-1,0,0};
  72.  
  73.         for(int i=0; i<N; i++)
  74.         {
  75.             for(int j=0; j<M; j++)
  76.             {
  77.                 for(int k=0; k<4; k++)
  78.                 {
  79.                     int nx = i + dx[k];
  80.                     int ny = j + dy[k];
  81.                     if(nx>=0 && nx<N && ny>=0 && ny<M)
  82.                     {
  83.                         Edge e = Edge(i,j,nx,ny,abs(grid[i][j]-grid[nx][ny]));
  84.                         e.val = f[i][j] || f[nx][ny];
  85.                         Edges.push_back(e);
  86.  
  87.                     }
  88.                 }
  89.             }
  90.         }
  91.  
  92.         set<pair<int,int> >SET;
  93.         SET.clear();
  94.         sort(Edges.begin(),Edges.end(),comp);
  95.         int mx = 0;
  96.         int i=0;
  97.         set<int>parents;
  98.         for(i=0; i<Edges.size(); i++)
  99.         {
  100.             Edge e = Edges[i];
  101.             int px = find_parent(e.ux,e.uy);
  102.             int py = find_parent(e.vx,e.vy);
  103.             if(px!=py)
  104.             {
  105.                 if(parents.find(px)!=parents.end())
  106.                 {
  107.                     parent[py/1000][py%1000] = px;
  108.                     auto idx = parents.find(py);
  109.                     if(idx!=parents.end())parents.erase(idx);
  110.                 }
  111.                 else if(parents.find(py)!=parents.end())
  112.                 {
  113.                     parent[px/1000][px%1000] = py;
  114.                 }
  115.                 else
  116.                 {
  117.                     parent[px/1000][px%1000] = py;
  118.                     if(f[e.ux][e.uy] || f[e.vx][e.vy])
  119.                     {
  120.                         parents.insert(py);
  121.                     }
  122.                 }
  123.             }
  124.             mx = max(mx,e.w);
  125.             if(f[e.ux][e.uy])
  126.             {
  127.                 SET.insert(make_pair(e.ux,e.uy));
  128.             }
  129.             if(f[e.vx][e.vy])
  130.             {
  131.                 SET.insert(make_pair(e.vx,e.vy));
  132.  
  133.             }
  134.             if(SET.size()==total_one && parents.size()==1)break;
  135.         }
  136.         cout << mx << endl;
  137.     }
  138.  
  139. }
Advertisement
Add Comment
Please, Sign In to add comment