1321. Robot

每个周五都深深地打击了我幼小的心灵...

一个错误在考场卡一个小时,回宿舍1分钟就看出,妈的真是不可言状的伤啊...

上午不会做,下午听不懂,小学期有没有这么伤人啊...

1321. Robot
就是将一个 row * column 的图转化成 一个带权有向图, 共有row * column 个顶点, 10000的大小,

 用链表的形式储存的话大小小于 40000个int,因为每个点最多只有4个相邻点!~

最后用dijkstra 求最短路径, 记得加上起点的权值~

好像还可以用堆优化,没用过stl中的堆,先记录下,过几天学习下

0.4,不算太快...


#include<stdio.h>
#include<vector>
#include<cstring>
using namespace std;

int r , c;
struct POINT{
   int x, y;
};
POINT s , e;
struct PAIR{
   int id , cost;
};
vector<PAIR> v[10001];  
#define MAX 999999
int dis[10001];
void djs(int source,int n){
	  bool found[10001];
	  memset(found, 0, sizeof(found));
      int i , j;
	  for(i = 1; i<v[source].size(); i++) dis[v[source][i].id] = v[source][i].cost;
	  found[source] = 1;
	  dis[source] = 0;

	  int w;
	  for(i = 0; i < n; i++){
	        int min = MAX;
			for(j = 0; j< n; j++)if(!found[j]){
				if(dis[j] < min) { min = dis[j];w = j;}  }

			found[w] = true;
			for(j = 1; j < v[w].size(); j++)if(!found[v[w][j].id]){
				if(min + v[w][j].cost < dis[v[w][j].id])
					dis[v[w][j].id] = min + v[w][j].cost;
			}
	  }
}
inline void build_graph(int cnt){
	PAIR p;
	int i;
	for(i = 0; i < cnt; i++){
				if((i+1)%c!=0) { p.cost = v[i+1][0].cost;p.id = i + 1;v[i].push_back(p);}
				if((i + c) < r * c){ p.cost = v[i+c][0].cost;p.id = i + c; v[i].push_back(p);}
				if((i%c)!=0 && i > 0){ p.cost = v[i-1][0].cost;p.id = i - 1;v[i].push_back(p);}
				if((i - c) > -1){ p.cost = v[i-c][0].cost;p.id = i - c; v[i].push_back(p);}
			}
   
}

int main(){
	  //freopen("in.txt", "r", stdin);
      int cas;
	  scanf("%d", &cas);
	  while(cas--){
		  int cnt = 0;
	        scanf("%d%d", &r, &c);
		
			int  i , j;
			for(i = 0; i< r * c; i++) v[i].clear();
			PAIR p;
			while(cnt < r * c){ scanf("%d", &p.cost); p.id = cnt; v[cnt].push_back(p);cnt++;}
			scanf("%d%d%d%d", &s.x, &s.y, &e.x, &e.y);
			
			build_graph(cnt);
			int a = (s.x - 1) * c + s.y - 1;
			int b = (e.x - 1) * c + e.y - 1;

			for(i = 0; i< cnt; i++) dis[i] = MAX;
			djs(a , r * c);
			printf("%d\n", dis[b] + v[a][0].cost );


	  }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值