Dijkstra算法之二

//sicily 1321. Robot

#include
<iostream> //Dijkstra算法
using namespace std;
#define MaxWeight 99999
int table[110][110],S[10010],dist[10010]; //S[]记录是否访问过,dist[]记录各点到起点的最短距离
int move[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int main()
{
int cases,m,n,x1,y1,x2,y2,i,j;
cin
>>cases;
while(cases--)
{
cin
>>m>>n;
for(i=0;i<m;++i)
for(j=0;j<n;++j)
cin
>>table[i][j];
cin
>>x1>>y1>>x2>>y2;
fill(dist,dist
+m*n,MaxWeight);
dist[(x1
-1)*n+y1-1]=0;
fill(S,S
+m*n,0);
int min,u,v,x,y;
for(i=1;i<=m*n;++i) //寻找各点最短路径,因为一开始起点是看作还未被遍历过的,(从fill(S,S+m*n,0);可以看出),所以这里循环次数为全部顶点数
{
min
=MaxWeight;
for(j=0;j<m*n;++j)
if(!S[j]&&dist[j]<min)
{
u
=j;min=dist[j];
}
S[u]
=1;
x
=u/n;y=u%n;
if(x+1==x2&&y+1==y2) //如果探测到终点即可退出
{
cout
<<dist[u]+table[x1-1][y1-1]<<endl; //要加上起点所需的费用
break;
}
for(j=0;j<4;++j)
{
int tx=x+move[j][0],ty=y+move[j][1];
if(tx>=0&&tx<m&&ty>=0&&ty<n)
{
v
=tx*n+ty;
if(S[v]==0&&dist[u]+table[tx][ty]<dist[v])
{
dist[v]
=dist[u]+table[tx][ty];
}
}
}
}
}
return 0;
}

  

posted on 2011-07-17 01:44  sysu_mjc  阅读(147)  评论(0编辑  收藏  举报

导航