#include #include #include #include #include using namespace std; struct stone { int x,y,z; }; int n,m,p; stone stones[10011]; int SX,SY,SZ; int EX,EY,EZ; int S,E; vector< pair > Graph[10011]; int Sq(int a) { return a*a; } int Dist(int a,int b) { return Sq(stones[a].x-stones[b].x)+Sq(stones[a].y-stones[b].y); } double DDist(int a,int b) { return sqrt( (double)Dist(a,b) ); } double D[10011]; bool TFO[10011]; int lastupd[10011]; vector Path; void GetPath() { int k=E; while(k!=0) { Path.push_back(k); k=lastupd[k]; } return; } void Dijkstra() { int i,j; double smallest_dist; int bestver; memset(TFO,false,sizeof(TFO)); for (i=1;i<=p;i++) { D[i]=-1.0; } D[S]=0.0; lastupd[S]=0; for (i=1;i<=p;i++) { smallest_dist=999999999.0; bestver=-1; for (j=1;j<=p;j++) { if (D[j]>-0.5 && !TFO[j]) { if (smallest_dist>D[j]) { smallest_dist=D[j]; bestver=j; } } } if (bestver==-1) break; TFO[bestver]=true; if (bestver==E) { GetPath(); break; } for (j=0;j=1) { Graph[i].push_back( make_pair(j,1.0) ); Graph[j].push_back( make_pair(i,1.0) ); } } } } Dijkstra(); printf("%d\n",(int)Path.size()); for (i=(int)Path.size()-1;i>=0;i--) { printf("%d %d %d\n",stones[ Path[i] ].x,stones[ Path[i] ].y,stones[ Path[i] ].z); } return 0; } /** 3 5 8 0 1 0 2 1 0 0 2 0 0 2 1 2 1 1 2 1 2 2 2 2 0 2 2 0 1 0 2 2 2 **/