| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
spfa_slf 和 dij_head都能飘过,不过都不是好的解法。#include <iostream>
#include <cstdio>
#include <fstream>
#include <stdlib.h>
#include <time.h>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
typedef long long LL;
struct E {
int to;
int next;
LL cost;
E() {}
E(int a, LL b):to(a),cost(b) {}
};
const int maxn = 1100000;
const int oo = 0xffffffff;
int head[2*maxn];
E edge[6*maxn];
LL dist[2*maxn];
bool vis[2*maxn];
int n, eid = 1;
inline void addEdge(int from, int to, LL cost) {
edge[eid].to = to;
edge[eid].cost = cost;
edge[eid].next = head[from];
head[from] = eid ++;
}
//
//struct node {
// int to;
// LL dis;
// node() {}
// node(int a, LL b) {
// to = a, dis = b;
// }
// bool operator < (const node& other) const {
// return dis > other.dis;
// }
//};
//void dijkstra_heap(int s) {
// for (int i = 0; i <= 2 * n + 1; i ++) {
// dist[i] = -1;
// vis[i] = false;
// }
// priority_queue<node> que;
// dist[s] = 0;
// que.push(node(s, 0));
// while (!que.empty()) {
// node cur = que.top();
// que.pop();
// int from = cur.to;
// if(vis[from]) {
// continue;
// }
// vis[from] = true;
// for (int i = head[from]; ~i; i = edge[i].next) {
// int to = edge[i].to;
// if(!vis[to] && dist[to] == -1 || dist[to] > dist[from] + edge[i].cost) {
// dist[to] = dist[from] + edge[i].cost;
// que.push(node(to, dist[to]));
// }
// }
// }
//}
void spfa_slf(int s) {
deque<int> que;
for (int i = 0; i <= 2 * n + 1; i++) {
dist[i] = oo;
vis[i] = 0;
}
dist[s] = 0;
vis[s] = 1;
que.push_back(s);
while (!que.empty()) {
int cur = que.front();
que.pop_front();
vis[cur] = 0;
for (int j = head[cur]; j != -1; j = edge[j].next) {
int e = edge[j].to;
if(dist[e] == oo || dist[e] > dist[cur] + edge[j].cost) {
dist[e] = dist[cur] + edge[j].cost;
if(!vis[e]) {
vis[e] = 1;
if(!que.empty()) {
if(dist[e] > dist[que.front()]) {
que.push_back(e);
} else {
que.push_front(e);
}
} else {
que.push_back(e);
}
}
}
}
}
}
int dir[2] = {0};
int main() {
int x, y, st, ed;
LL dis;
while (scanf("%d", &n) != EOF, n) {
dir[1] = n + 1;
scanf("%d%d", &x, &y);
st = y + dir[x];
scanf("%d%d", &x, &y);
ed = y + dir[x];
fill(head, head + 2 * n + 2, -1);
for (int i = 0; i < n; i ++) {
scanf("%I64d", &dis);
addEdge(i, i + 1, dis);
addEdge(i + 1, i, dis);
}
for (int i = 0; i <= n; i ++) {
scanf("%I64d", &dis);
addEdge(i, i + n + 1, dis);
addEdge(i + n + 1, i, dis);
}
for (int i = n + 1; i < 2 * n + 1; i ++) {
scanf("%I64d", &dis);
addEdge(i, i + 1, dis);
addEdge(i + 1, i, dis);
}
// dijkstra_heap(st);
spfa_slf(st);
printf("%I64d\n", dist[ed]);
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator