Cod sursa(job #636832)

Utilizator excelsiorExcelsior excelsior Data 20 noiembrie 2011 00:08:59
Problema Portal3 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 2.79 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>

#include<queue>
#define pb push_back
#define oo 3000000000
long long N,M;
long long a[10][10];
struct ed{
long long y,lg;
};
vector<ed> G[10];
queue<long long> q;
long long d[10];
int isinq[10];
ofstream fout("portal3.out");

long long abs(long long x)
{
    if(x>0)
       return x;
    return -x;
}

void solve()
{
    long long n=8;
    int i;
  for(i=1;i<=n;i++)
  {
      d[i]=oo;
      isinq[i]=0;
  }
  d[1]=0;
  q.push(1);
  isinq[1]=1;
  long long u;
  vector<ed>::iterator it;
  while(!q.empty())
  {
      u=q.front();
      //cout<<u<<" ";
      q.pop();
      isinq[u]=0;
      for(it=G[u].begin();it<G[u].end();it++)
      {
          if(d[it->y]>it->lg+d[u])
          {
              d[it->y]=it->lg+d[u];
              if(!isinq[it->y])
              {
                  q.push(it->y);
                  isinq[it->y]=1;
              }
          }
      }
  }
  for(i=1;i<=n;i++)
    cout<<d[i]<<" :";
  fout<<d[n]<<"\n";
}

void cit()
{
    ifstream fin("portal3.in");
    int T,i,j;
    fin>>T;

    while(T--)
    {
        fin>>N>>M;
        for(i=1;i<=3;i++)
        for(j=1;j<=5;j++)
        {
            fin>>a[i][j];
        }
        for(i=1;i<=8;i++)
        {
            G[i].clear();
        }
        G[1].pb((ed){8,N+M});
        for(i=1;i<=3;i++)
        {
            G[1].pb((ed){i+1,a[i][1]+a[i][2]});
            G[4+i].pb((ed){8,N-a[i][3]+M-a[i][4]});
            G[i+1].pb((ed){8,N-a[i][1]+M-a[i][2]});
            G[1].pb((ed){4+i,a[i][3]+a[i][4]});
            G[i+1].pb((ed){4+i,a[i][5]});
            G[4+i].pb((ed){i+1,a[i][5]});
        }
        for(i=1;i<=3;i++)
        {
            for(j=1;j<=3;j++)
            {
                if(i<j)
                {
                    G[i+1].pb((ed){j+1,abs(a[i][1]-a[j][1])+abs(a[i][2]-a[j][2])});
                    G[4+i].pb((ed){j+1,abs(a[i][3]-a[j][1])+abs(a[i][4]-a[j][2])});
                    G[j+1].pb((ed){i+1,abs(a[i][1]-a[j][1])+abs(a[i][2]-a[j][2])});
                    G[4+j].pb((ed){i+1,abs(a[i][1]-a[j][3])+abs(a[i][2]-a[j][4])});
                    G[i+1].pb((ed){4+j,abs(a[i][1]-a[j][3])+abs(a[i][2]-a[j][4])});
                    G[4+i].pb((ed){4+j,abs(a[i][3]-a[j][3])+abs(a[i][4]-a[j][4])});
                    G[j+1].pb((ed){4+i,abs(a[i][3]-a[j][1])+abs(a[i][4]-a[j][2])});
                    G[4+j].pb((ed){4+i,abs(a[i][3]-a[j][3])+abs(a[i][4]-a[j][4])});
                }
            }
        }

        solve();
    }

    /*cout<<"\n\n"<<N<<"\n\n";
    vector<ed>::iterator it;
    for(i=1;i<=8;i++)
    {
        cout<<i<<" : ";
        for(it=G[i].begin();it<G[i].end();it++)
        {
           cout<<it->y<<" := "<<it->lg<<" ;   ";
        }
        cout<<"\n";
    }*/

    fin.close();
}

int main()
{
    cit();
    fout.close();
    return 0;
}