結果
問題 | No.340 雪の足跡 |
ユーザー |
![]() |
提出日時 | 2016-02-07 10:16:01 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 852 ms / 1,000 ms |
コード長 | 2,889 bytes |
コンパイル時間 | 1,591 ms |
コンパイル使用メモリ | 174,192 KB |
実行使用メモリ | 224,000 KB |
最終ジャッジ日時 | 2024-09-21 21:00:54 |
合計ジャッジ時間 | 11,042 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 32 |
ソースコード
#include <bits/stdc++.h>using namespace std;typedef long long int ll;typedef pair<int, int> P;typedef pair<ll, ll> Pll;typedef vector<int> Vi;//typedef tuple<int, int, int> T;#define FOR(i,s,x) for(int i=s;i<(int)(x);i++)#define REP(i,x) FOR(i,0,x)#define ALL(c) c.begin(), c.end()#define DUMP( x ) cerr << #x << " = " << ( x ) << endlconst int dr[4] = {-1, 0, 1, 0};const int dc[4] = {0, 1, 0, -1};#define INF 1<<30#define MAX_V 1000010// graph by adjacency liststruct Edge {int dst, weight;Edge(int dst, int weight) :dst(dst), weight(weight) { }bool operator < (const Edge &e) const {return weight > e.weight;}};struct Graph {int V;vector<vector<Edge>> E;Graph(int V) : V(V) { E.resize(V); }void add_edge(int src, int dst, int weight) {E[src].push_back(Edge(dst, weight));}};struct Node {int v, dist;Node(int v, int dist) :v(v), dist(dist) { };bool operator < (const Node &n) const {return dist > n.dist; // reverse}};struct ShortestPath {const Graph g;int start;vector<int> dist;ShortestPath(const Graph g, int start) :g(g), start(start) { }void dijkstra() {std::priority_queue<Node> que;dist.resize(g.V, INF);dist[start] = 0;que.push(Node(start, 0));while (!que.empty()) {Node n = que.top(); que.pop();int v = n.v, cost = n.dist;if (dist[v] < cost) continue;for (Edge e : g.E[v]) {if (dist[v] + e.weight < dist[e.dst]) {dist[e.dst] = dist[v] + e.weight;que.push(Node(e.dst, dist[e.dst]));}}}}};int main() {// use scanf in CodeForces!cin.tie(0);ios_base::sync_with_stdio(false);int W, H, N;cin >> W >> H >> N;vector<int> imos_w(H*W, 0), imos_h(H*W, 0);REP(i, N) {int M, prev; cin >> M >> prev;REP(i, M) {int b; cin >> b;int p1 = prev, p2 = b; if (p1 > p2) swap(p1, p2);int r1 = p1 / W, c1 = p1 % W, r2 = p2 / W, c2 = p2 % W;//cout << '(' << r1 << ',' << c1 << ')' << ' ' << '(' << r2 << ',' << c2 << ')' << endl;if (r1 == r2) {imos_w[p1]++, imos_w[p2]--;} else if (c1 == c2) {imos_h[c1 * H + r1]++, imos_h[c2 * H + r2]--;}prev = b;}}REP(i, W*H-1) imos_h[i+1] += imos_h[i], imos_w[i+1] += imos_w[i];Graph g(H*W);REP(i, H*W) {if (imos_w[i]) g.add_edge(i, i+1, 1), g.add_edge(i+1, i, 1);if (imos_h[i]) {int p1 = (i%H)*W+i/H, p2 = p1 + W;g.add_edge(p1, p2, 1), g.add_edge(p2, p1, 1);}}/*REP(i, W*H) {cout << i << ':';for (auto v : g.E[i]) cout << v.dst << ' ';cout << endl;}*/ShortestPath sp(g, 0);sp.dijkstra();if (sp.dist[W*H-1] == INF) {cout << "Odekakedekinai.." << endl;} else {cout << sp.dist[W*H-1] << endl;}//REP(i, g.V) cout << sp.dist[i] << (i == g.V-1 ? '\n' : ' ');return 0;}