Cod sursa(job #637526)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 20 noiembrie 2011 15:04:00
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 2.5 kb
#include<cstdio>
#include<vector>
#include<deque>
#include<utility>
using namespace std;

int n,m,t,x,y,c,x1,y1,x2,y2,i,j,oo=1<<30,d[15],q[15],L[15][15],dist(int,int,int,int);
vector<pair<int, int> > V[15],pct;
deque<int> Q;

void read(),solve();

int main()
{
	read();
	solve();
	
	return 0;
}

void read()
{
	freopen("portal3.in","r",stdin);
	freopen("portal3.out","w",stdout);
	scanf("%d",&t);
}

void solve()
{
	for(;t;t--)
	{
		pct.clear();
		for(i=1;i<15;i++)V[i].clear();
		scanf("%d%d",&n,&m);
		pct.push_back(make_pair(0,0));
		scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&c);
		V[2].push_back(make_pair(3,c));
		V[3].push_back(make_pair(2,c));
		L[2][3]=L[3][2]=t;
		pct.push_back(make_pair(x1,y1));
		pct.push_back(make_pair(x2,y2));
		
		scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&c);
		V[4].push_back(make_pair(5,c));
		V[5].push_back(make_pair(4,c));
		L[4][5]=L[5][4]=t;
		pct.push_back(make_pair(x1,y1));
		pct.push_back(make_pair(x2,y2));
		
		
		scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&c);
		V[6].push_back(make_pair(7,c));
		V[7].push_back(make_pair(6,c));
		L[6][7]=L[7][6]=t;
		pct.push_back(make_pair(x1,y1));
		pct.push_back(make_pair(x2,y2));
		
		pct.push_back(make_pair(n,m));
		vector<pair<int,int> >::iterator it1,it2;
		/*for(it1=pct.begin();it1!=pct.end();it1++)
			printf("%d %d\n",it1->first,it1->second);
		printf("\n\n\n");
		*/
		for(i=0;i<8;i++)
		{
			it1=pct.begin()+i;
			x1=it1->first;y1=it1->second;
			for(j=0;j<8;j++)
			{
				if(i==j)continue;
				it2=pct.begin()+j;
				x2=it2->first;y2=it2->second;
				if(L[i+1][j+1]!=t)
					V[i+1].push_back(make_pair(j+1,dist(x1,y1,x2,y2) ));
				if(L[j+1][i+1]!=t)
					V[j+1].push_back(make_pair(i+1,dist(x1,y1,x2,y2) ));
				L[i+1][j+1]=L[j+1][i+1]=t;
			}
		}
		/*for(i=1;i<=8;i++)
		{
			for(vector<pair<int,int> >::iterator it=V[i].begin();it!=V[i].end();it++)
			{
				printf("%d %d %d\n",i,it->first,it->second);
			}
		}*/
		for(i=2;i<=10;i++)d[i]=oo;
		Q.push_back(1);q[i]=1;
		for(;Q.size();)
		{
			x=Q.front();
			for(vector<pair<int,int> >::iterator it=V[x].begin();it!=V[x].end();it++)
			{
				y=it->first;c=it->second;
				
				if(d[x]+c<d[y])
				{
					if(!q[y])
					{
						Q.push_back(y);
						q[y]=1;
					}
					d[y]=d[x]+c;
				}
			}
			Q.pop_front();q[x]=0;
		}
		printf("%d\n",d[8]);
	}
}

int dist(int x1,int y1,int x2,int y2)
{
	int sum=0;
	if(x1<x2)sum+=x2-x1;
	else     sum+=x1-x2;
	if(y1<y2)sum+=y2-y1;
	else     sum+=y1-y2;
	
	return sum;
}