#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define all(v) v.begin(),v.end() using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; const ld eps = 1e-9; int n,k; int fld[201][201]; int A,B; vector > ufos; vector, int> > nbs[200][200]; int newGraph[10][10]; int MOVE[][2] = {{0,1},{0,-1},{-1,0},{1,0}}; //fill nbsGraph void fillNbsGraph() { for (int i=0;i=n||ny<0||ny>=n)continue; int delta;int X=fld[i][j]; int Y=fld[ny][nx]; if (X>=Y)delta=1+X-Y; else delta = 1+(Y-X)*(Y-X); /* fprintf(stderr,"dist from %d,%d to %d,%d is : %d\n", i,j,ny,nx,delta); */ nbs[i][j].push_back(make_pair(make_pair(ny,nx),delta)); } } } } int dist[200][200]; bool vis[200][200]; //find shortestPathToAll void findShortestFromToAll(int fromI, int fromJ) { int y,x,curDist,i,nbY,nbX,nbD,nbsz,*dstnynx; vector, int> >* nbbb; pair,int>* ppp; priority_queue > > pq; memset(dist,-1,sizeof(dist)); dist[fromI][fromJ]=0; memset(vis,0,sizeof(vis)); pq.push(make_pair(0, make_pair(fromI,fromJ))); while(!pq.empty()) { pair > tp = pq.top(); pq.pop(); y=tp.second.first; x = tp.second.second; curDist = -tp.first; if (vis[y][x]) continue; nbbb = &nbs[y][x]; nbsz = nbbb->size(); for (i=0;iat(i)); nbY=ppp->first.first; nbX=ppp->first.second; nbD=ppp->second; if (vis[nbY][nbX])continue; dstnynx=&dist[nbY][nbX]; if (*dstnynx==-1 || *dstnynx>curDist+nbD) { *dstnynx=curDist+nbD; pq.push(make_pair(-*dstnynx,make_pair(nbY,nbX))); } } } } //makeNewGraph void makeNewGraph() { for (int i=0;i perms; for (int i = 1; i <=k;++i)perms.push_back(i); // for each perm do { int curRes = newGraph[0][perms[0]]; for (int i=1;i