每个周五都深深地打击了我幼小的心灵...
一个错误在考场卡一个小时,回宿舍1分钟就看出,妈的真是不可言状的伤啊...
上午不会做,下午听不懂,小学期有没有这么伤人啊...
1321. Robot
用链表的形式储存的话大小小于 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 );
}
}