1321. Robot

来源:互联网 发布:手机三维扫描软件 编辑:程序博客网 时间:2024/06/08 10:08

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

一个错误在考场卡一个小时,回宿舍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 999999int 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 );  }}