結果

提出番号 154
提出者 Luzhiled
言語 C++
提出日時 2017-06-30 22:33:42
問題名 (2)Taxis
結果 MLE
点数 80%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 3ms 8256KB
2 AC 100% 3ms 7504KB
3 AC 100% 4ms 7920KB
4 AC 100% 33ms 8112KB
5 MLE 0% 1843ms 504368KB

ソースコード

#include <bits/stdc++.h>
using namespace std;

#define fs first
#define sc second
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define rep(i, n) for (int i = 0; i < n; ++i)
#define pb emplace_back

using pii = pair<int, int>;
using vi = vector<int>;
using lint = long long;

const int inf = 1001001001;
const lint linf = 1001001001001001001ll;
const int mod = 1e9 + 7;
const int dx[]{0, 1, 0, -1, -1, -1, 1, 1}, dy[]{1, 0, -1, 0, -1, 1, -1, 1};

template<typename T> inline bool chmin(T &a, T b) { if (a > b) { a = b; } return a > b; }
template<typename T> inline bool chmax(T &a, T b) { if (a < b) { a = b; } return a < b; }
template<typename T> inline void print(const T &x, string s = "\n") { cout << x << s; }
template<typename T> inline void print(const vector<T> &v, string s = " ") 
{ rep(i, v.size()) cout << v[i] << (i + 1 == v.size() ? "\n" : s); }
inline bool inside(int y, int x, int H, int W) { return 0 <= y && y < H && 0 <= x && x < W; }
inline lint in() { lint x; std::cin>>x; return x; }

struct edge {
	edge() {}
	edge(int a, int b) { to = a; cost = b; }
	int to, cost;
};

int n, k;

int d[5050];
vector<edge> G[5050];

int dijkstra(int s = 0) {
	priority_queue<pii, vector<pii>, greater<pii>> q;
	fill(d, d + 5050, inf);

	d[s] = 0;
	q.push(pii(d[s], s));

	while (!q.empty()) {
		pii p = q.top(); q.pop();
		int v = p.sc;

		if (d[v] < p.fs) continue;
		
		for (int i = 0; i < G[v].size(); ++i) {
			edge e = G[v][i];
			if (d[e.to] > d[v] + e.cost) {
				d[e.to] = d[v] + e.cost;
				q.push(pii(d[e.to], e.to));
			}
		}
	}

	return d[n - 1];
}

vi c, r;
vi E[5050];
bool f[5050];
void bfs(int v) {
	bool u[5050] = {false};
	queue<pii> q;

	q.push(pii(v, r[v] + 1));
	while (!q.empty()) {
		pii p = q.front();
		q.pop();
		if (p.sc == 0 || u[p.fs]) continue;
		u[p.fs] = true;
		G[v].pb(edge(p.fs, c[v]));
		for (int i = 0; i < E[p.fs].size(); ++i) {
			q.push(pii(E[p.fs][i], p.sc - 1));
		}
	}
}

int main() {
	cin >> n >> k;
	rep(i, n) { c.pb(in()); r.pb(in()); }
	rep(i, k) {
		int a = in() - 1, b = in() - 1;
		E[a].pb(b);
		E[b].pb(a);
	}

	rep(i, n) bfs(i);

	cout << dijkstra() << endl;
}