結果

問題 No.340 雪の足跡
ユーザー n_knuu
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#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 ) << endl
const 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 list
struct 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;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0