iscsi

Codechef Flight

Feb 3rd, 2012
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.97 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <vector>
  6. #include <queue>
  7. #include <set>
  8. #include <map>
  9. #include <cstdio>
  10. #include <cstdlib>
  11. #include <cctype>
  12. #include <cmath>
  13. #include <cstring>
  14. #include <ctime>
  15. #include <cassert>
  16. using namespace std;
  17. typedef unsigned long long LL;
  18. #define FOR(k,a,b) for(LL k(a); k < (b); ++k)
  19. #define FORD(k,a,b) for(int k(b-1); k >= (a); --k)
  20. #define REP(k,a) for(int k=0; k < (a); ++k)
  21. #define ABS(a) ((a)>0?(a):-(a))
  22. #ifdef HOME
  23. #include "debug.h"
  24. #else
  25. #define debug()
  26. #endif
  27. int main()
  28. {
  29. #ifdef HOME
  30.     clock_t start=clock();
  31.     freopen ("in.txt","r",stdin);
  32.     freopen ("out.txt","w",stdout);
  33.     freopen ("out_err.txt","w",stderr);
  34. #endif
  35.     //input gen
  36.     // const int NN=10;
  37.     // cout << 10 << " " << 45 << endl;
  38.     // REP(i,NN)
  39.     // FOR(j,i+1,NN)
  40.     // cout << i << " " << j << " " << rand()%20+1 << endl;
  41.     // return 0;
  42.  
  43.     int N,M;
  44.     int change=0;
  45.     const int INF=10000;
  46.     cin >> N;
  47.     cin >> M;
  48.     int tmp1,tmp2;
  49.     vector<pair< pair<int,int>,int> > edges(M);
  50.     vector<vector<int> > g(N,vector<int> (N,INF));// node-node -> cost graph
  51.     vector<vector<int> > f(N,vector<int> (N,INF));// node-node -> edge
  52.  
  53.     REP(i,M)
  54.     {
  55.         cin >> edges[i].first.first >> edges[i].first.second >> edges[i].second;
  56.         edges[i].second*=2;
  57.         g[edges[i].first.first][edges[i].first.second]=edges[i].second;
  58.         g[edges[i].first.second][edges[i].first.first]=edges[i].second;
  59.         f[edges[i].first.first][edges[i].first.second]=i;
  60.         f[edges[i].first.second][edges[i].first.first]=i;
  61.     }
  62.  
  63.     vector<vector<pair<int,int> > > e(M);//edges -> minimal circle id, sign
  64.     vector<int> m;//minimal circle cost
  65.  
  66.     REP(i,N)
  67.     {
  68.         //looking for just >i nodes
  69.         // int actual node, vector<int> prev nodes
  70.         typedef pair<int,vector<int> > qType;
  71.         deque<qType> q;
  72.         q.push_back(make_pair(i,vector<int> (1,i)));
  73.         while(q.size())
  74.         {
  75.             int actnode=q.front().first;
  76.             vector<int> actv;
  77.             actv.swap(q.front().second);
  78.             q.pop_front();
  79.             FOR(j,i,N)
  80.             {
  81.                 if(actv.size()<3 && j==i)
  82.                     continue;
  83.                 if(g[actnode][j]<INF)
  84.                 {
  85.                     if(j==i)
  86.                     {//this is an minimal circle yupik
  87.                         //eliminate duplications
  88.                         if(actv[1]>actv.back())
  89.                             break;
  90.                         vector<int> actedges;
  91.                         FOR(k,1,actv.size())
  92.                         {
  93.                             actedges.push_back(f[actv[k-1]][actv[k]]);
  94.                         }
  95.                         actedges.push_back(f[actv.back()][i]);
  96.                         REP(k,actedges.size())
  97.                         {
  98.                             int sumcost=0;
  99.                             REP(t,actedges.size())
  100.                             {
  101.                                 if(t==k)
  102.                                     sumcost-=edges[actedges[t]].second;
  103.                                 else
  104.                                     sumcost+=edges[actedges[t]].second;
  105.                             }
  106.                             REP(t,actedges.size())
  107.                             {
  108.                                 if(t==k)
  109.                                     e[actedges[t]].push_back(make_pair(m.size(),-1));
  110.                                 else
  111.                                     e[actedges[t]].push_back(make_pair(m.size(),1));
  112.                             }
  113.                             m.push_back(sumcost);
  114.                         }
  115.                         break;
  116.                     }
  117.                     bool ok=true;
  118.                     FOR(k,1,actv.size()-1)
  119.                     {//contain circle
  120.                         if(g[j][actv[k]]<INF || j==actv[k])
  121.                         {
  122.                             ok=false;
  123.                             break;
  124.                         }
  125.                     }
  126.                     if(!ok)
  127.                         continue;
  128.                     q.push_back(make_pair(j,actv));
  129.                     q.back().second.push_back(j);
  130.                 }
  131.             }
  132.         }
  133.     }
  134.     int actualbadcost=0;
  135.     REP(i,m.size())
  136.         if(m[i]<0)
  137.             actualbadcost+=m[i];
  138.     int round=0;
  139.     while(actualbadcost<0)
  140.     {
  141.         ++round;
  142.         int best=-1,bestdir=0,bestimprove=-1;
  143.         REP(i,M)
  144.             for(int j=-1;j<2;j+=2)
  145.                 if(edges[i].second+j>0)
  146.                 {
  147.                     int improve=0;
  148.                     REP(k,e[i].size())
  149.                     {
  150.                         if(m[e[i][k].first]<0 || (m[e[i][k].first]==0 && e[i][k].second*bestdir<0))
  151.                             improve+=e[i][k].second*j;
  152.                     }
  153.                     if(improve>bestimprove)
  154.                     {
  155.                         best=i;
  156.                         bestdir=j;
  157.                         bestimprove=improve;
  158.                     }
  159.                 }
  160.                 actualbadcost+=bestimprove;
  161.                 edges[best].second+=bestdir;
  162.                 REP(k,e[best].size())
  163.                 {
  164.                     m[e[best][k].first]+=bestdir*e[best][k].second;
  165.                 }
  166.     }
  167.     cout << round/2 << "/1" << endl;
  168. #ifdef HOME
  169.     fprintf(stderr,"time=%.3lfsec\n",0.001*(clock()-start));
  170. #endif
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment