Facebook
From Idiotic Baboon, 3 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 49
  1. #include<bits/stdc++.h>
  2. #define endl "n"
  3. using namespace std;
  4. const int MAXN=1024,MAXM=10005;
  5. int n,m;
  6. int used[MAXM],mat[MAXN],f[MAXN][MAXN],reb[MAXN];
  7. vector<pair<int,int> >ind;
  8. struct place
  9. {
  10.     int x,y,vol;
  11.     place() {}
  12.     place(int _x,int _y,int _vol)
  13.     {
  14.         x=_x;
  15.         y=_y;
  16.         vol=_vol;
  17.     }
  18. };
  19. vector<place>p;
  20. vector<pair<double,pair<int,int> > >edges;
  21. vector<int>graph[MAXN];
  22. inline void speed ()
  23. {
  24.     ios_base::sync_with_stdio(0);
  25.     cin.tie(0);
  26.     cout.tie(0);
  27. }
  28. inline double dist(pair<int,int> a,place b)
  29. {
  30.     double ret=(a.first-b.x)*(a.first-b.x)+(a.second-b.y)*(a.second-b.y);
  31.     return sqrt(ret);
  32. }
  33. void read()
  34. {
  35.     int xx,yy,cc;
  36.     cin>>n>>m;
  37.     for(int i=0; i<n; i++)
  38.     {
  39.         cin>>xx>>yy;
  40.         ind.push_back({xx,yy});
  41.     }
  42.     for(int j=0; j<m; j++)
  43.     {
  44.         cin>>xx>>yy>>cc;
  45.         p.push_back(place(xx,yy,cc));
  46.     }
  47.  
  48.     for(int i=0; i<n; i++)
  49.     {
  50.         for(int j=0; j<m; j++)
  51.         {
  52.             double d=dist(ind[i],p[j]);
  53.             for(int s=0; s<p[j].vol; s++)
  54.             {
  55.                 int a=i+1,b=(i+1)*n+(j+1)*m+s;
  56.                 reb[b]=j;
  57.                 f[a][b]=d;
  58.                 f[b][a]=d;
  59.                 edges.push_back({d,{a,b}});
  60.             }
  61.         }
  62.     }
  63.     sort(edges.begin(),edges.end());
  64. }
  65.  
  66. int cnt;
  67. int try_kuhn(int v)
  68. {
  69.     if(used[v])return 0;
  70.     used[v]=1;
  71.     for(int i=0;i<graph[v].size();i++)
  72.     {
  73.         int to=graph[v][i];
  74.         if(mat[to]==0||try_kuhn(mat[to]))
  75.         {
  76.             cout<<to<<" "<<v<<" "<<f[to][v]<<" "<<reb[to]<<endl;
  77.             mat[to]=v;
  78.             mat[v]=to;
  79.             return 1;
  80.         }
  81.     }
  82.     return 0;
  83. }
  84. bool check()
  85. {
  86.     cnt=0;
  87.     for(int i=1; i<=n; i++)
  88.     {
  89.         memset(used,0,sizeof(used));
  90.         try_kuhn(i);
  91.        // cout<<cnt<<endl;
  92.     }
  93.     for(int i=1;i<=n;i++)
  94.     {
  95.  
  96.         if(mat[i]!=0)cnt++;
  97.     }
  98.    // cout<<cnt<<"doodle"<<endl;
  99.     cout<<endl;
  100.     return cnt>=n;
  101. }
  102. inline void add_edge(pair<int,int> e)
  103. {
  104.     graph[e.first].push_back(e.second);
  105. }
  106. void solve()
  107. {
  108.     double curr_ans=0,i=0;
  109.     do
  110.     {
  111.         memset(mat,0,sizeof(mat));
  112.         add_edge(edges[i].second);
  113.         curr_ans=edges[i].first;
  114.         i++;
  115.     }
  116.     while(check()==0&&i<edges.size());
  117.     cout<<curr_ans<<endl;
  118. }
  119. int main()
  120. {
  121.    //speed();
  122.     read();
  123.     solve();
  124.     return 0;
  125. }
  126.