记录编号 |
358608 |
评测结果 |
AAAAAAAAAAAAAAA |
题目名称 |
相遇时间 |
最终得分 |
100 |
用户昵称 |
Rapiz |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.167 s |
提交时间 |
2016-12-17 13:04:53 |
内存使用 |
3.20 MiB |
显示代码纯文本
#include <cstdio>
#include <algorithm>
#define file(x) "meeting." #x
using std::max;
const int V = 110, T = V*V, E = V*V;
int n, m, tb;
struct {
struct EDGE{int u, v, w;}st[E];
int hed[V], nxt[E], sz;
bool f[V][T];
void add(int u, int v, int w) {
st[++sz] = (EDGE){u, v, w};
nxt[sz] = hed[u], hed[u] = sz;
}
void mk() {
f[1][0] = 1;
for (int i = 1; i <= n; i++) for (int t = 0; t <= tb; t++) if (f[i][t])
for (int e = hed[i], v; v = st[e].v; e = nxt[e]) f[v][t + st[e].w] = 1;
}
}p, q;
int main() {
freopen(file(in), "r", stdin);
freopen(file(out), "w", stdout);
scanf("%d%d", &n, &m);
while (m--) {
int u, v, a, b;
scanf("%d%d%d%d", &u, &v, &a, &b);
p.add(u, v, a);
q.add(u, v, b);
tb = max(tb, max(a, b));
}
tb *= n;
q.mk();
p.mk();
for (int i = 0; i <= tb; i++) if (q.f[n][i] && p.f[n][i]) {
printf("%d", i);
return 0;
}
puts("IMPOSSIBLE");
}