比赛 |
东方幻想乡 S2 |
评测结果 |
AAAAAAAAAA |
题目名称 |
伊吹萃香 |
最终得分 |
100 |
用户昵称 |
王者自由 |
运行时间 |
0.104 s |
代码语言 |
C++ |
内存使用 |
0.58 MiB |
提交时间 |
2012-08-08 21:14:55 |
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int N = 5000*2 + 10;
int n, m, d[N];
vector<int> G[N], c[N];
bool l[N];
void Ins(int u, int v, int k) {
G[u].push_back(v);
c[u].push_back(k);
}
void Bellman(int s) {
memset(d, 15, sizeof(d));
queue<int> q;
d[s] = 0; q.push(s); l[s] = 1;
while(!q.empty()) {
int u = q.front(); q.pop(); l[u] = 0;
for(int i=0; i<G[u].size(); i++) {
int v = G[u][i];
if(d[v] > d[u] + c[u][i]) {
d[v] = d[u] + c[u][i];
if(!l[v]) {
l[v] = 1;
q.push(v);
}
}
}
}
}
int main() {
freopen("suika.in", "r", stdin);
freopen("suika.out", "w", stdout);
scanf("%d %d", &n, &m);
int p[N], w[N], s[N];
for(int i=1; i<=n; i++)
scanf("%d", p+i);
for(int i=1; i<=n; i++)
scanf("%d", w+i);
for(int i=1; i<=n; i++)
scanf("%d", s+i);
for(int i=1; i<=n; i++) {
Ins(i*2, i*2-1, 0);
Ins(i*2-1, i*2, s[i]);
}
for(int i=1; i<=m; i++) {
int u, v, k;
scanf("%d %d %d", &u, &v, &k);
if(p[u] == p[v]) {
Ins(u*2-1, v*2, k);
Ins(u*2, v*2-1, k);
} else {
Ins(u*2-1, v*2-1, k + abs(w[u] - w[v]));
Ins(u*2, v*2, max(k - abs(w[u] - w[v]), 0));
}
}
Bellman(2 - p[1]);
printf("%d\n", min(d[n*2], d[n*2-1]));
return 0;
}