結果
| 問題 |
No.1 道のショートカット
|
| コンテスト | |
| ユーザー |
eitaho
|
| 提出日時 | 2015-02-13 04:58:51 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
AC
|
| 実行時間 | 43 ms / 5,000 ms |
| コード長 | 5,911 bytes |
| コンパイル時間 | 978 ms |
| コンパイル使用メモリ | 113,920 KB |
| 実行使用メモリ | 20,480 KB |
| 最終ジャッジ日時 | 2024-07-20 16:09:24 |
| 合計ジャッジ時間 | 3,384 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Enu = System.Linq.Enumerable;
class Program
{
void Solve()
{
int N = reader.Int(), MaxCost = reader.Int(), NumE = reader.Int();
int[] A = reader.IntLine().Select(x => x - 1).ToArray();
int[] B = reader.IntLine().Select(x => x - 1).ToArray();
int[] Cost = reader.IntLine();
int[] Time = reader.IntLine();
var dij = new Dijkstra(N);
for (int i = 0; i < NumE; i++)
dij.AddEdge(A[i], B[i], Cost[i], Time[i]);
int ans = dij.MinCost(0, MaxCost);
if (ans == Dijkstra.INF) ans = -1;
Console.WriteLine(ans);
}
class Dijkstra
{
public static readonly int INF = (int)1e9;
private readonly List<Edge>[] G;
public Dijkstra(int V)
{
G = new List<Edge>[V];
for (int i = 0; i < G.Length; i++) G[i] = new List<Edge>();
}
public void AddEdge(int from, int to, int cost, int time)
{
G[from].Add(new Edge(to, cost, time));
}
public int MinCost(int start, int MaxCost)
{
var minTime = new int[G.Length, MaxCost + 1];
for (int i = 0; i < G.Length; i++)
for (int c = 0; c <= MaxCost; c++)
minTime[i, c] = INF;
minTime[start, 0] = 0;
var heap = new Heap<Vertex>();
heap.Push(new Vertex(start, 0, 0));
while (heap.Count > 0)
{
var t = heap.Pop();
int a = t.v;
var cost = t.cost;
int time = t.time;
if (time > minTime[a, cost]) continue;
foreach (var e in G[a])
{
int b = e.to;
var nextCost = cost + e.cost;
int nextTime = time + e.time;
if (nextCost <= MaxCost && nextTime < minTime[b, nextCost])
{
minTime[b, nextCost] = nextTime;
heap.Push(new Vertex(b, nextCost, nextTime));
}
}
}
return Enu.Range(0, MaxCost + 1).Min(c => minTime[G.Length - 1, c]);
}
public struct Vertex : IComparable<Vertex>
{
public int v, cost, time;
public Vertex(int v, int cost, int time) { this.v = v; this.cost = cost; this.time = time; }
public int CompareTo(Vertex other) { return Math.Sign(time - other.time); }
}
public struct Edge
{
public int to, cost, time;
public Edge(int to, int cost, int time) { this.to = to; this.cost = cost; this.time = time; }
}
}
class Heap<T>
{
public int Count { get { return size; } private set { size = value; } }
private int size;
private readonly int sign;
private readonly List<T> A = new List<T>();
private readonly Comparer<T> comp = Comparer<T>.Default;
public Heap(bool greater = false)
{
sign = greater ? 1 : -1;
}
public T Peek() { return A[0]; }
public void Push(T val)
{
if (size < A.Count) A[size] = val;
else A.Add(val);
Count++;
int i = Count - 1;
while (i > 0)
{
int parent = (i - 1) / 2;
if (Math.Sign(comp.Compare(val, A[parent])) == sign)
{
A[i] = A[parent];
i = parent;
}
else { break; }
}
A[i] = val;
}
public T Pop()
{
T res = A[0];
T val = A[--Count];
if (Count == 0) return res;
int i = 0;
while (i * 2 + 1 < Count)
{
int L = i * 2 + 1;
int R = i * 2 + 2;
if (R < Count && Math.Sign(comp.Compare(A[R], A[L])) == sign) { L = R; }
if (Math.Sign(comp.Compare(A[L], val)) == sign) { A[i] = A[L]; i = L; }
else { break; }
}
A[i] = val;
return res;
}
}
Reader reader = new Reader(Console.In);
static void Main() { new Program().Solve(); }
}
class Reader
{
private readonly TextReader reader;
private readonly char[] separator = { ' ' };
private readonly StringSplitOptions removeOp = StringSplitOptions.RemoveEmptyEntries;
private string[] A = new string[0];
private int i;
public Reader(TextReader r) { reader = r; }
public bool HasNext() { return Enqueue(); }
public string String() { return Dequeue(); }
public int Int() { return int.Parse(Dequeue()); }
public long Long() { return long.Parse(Dequeue()); }
public double Double() { return double.Parse(Dequeue()); }
public int[] IntLine() { var s = Line(); return s == "" ? new int[0] : Array.ConvertAll(Split(s), int.Parse); }
public int[] IntArray(int N) { return Enu.Range(0, N).Select(i => Int()).ToArray(); }
public int[][] IntGrid(int H) { return Enu.Range(0, H).Select(i => IntLine()).ToArray(); }
public string[] StringArray(int N) { return Enu.Range(0, N).Select(i => Line()).ToArray(); }
public string Line() { return reader.ReadLine().Trim(); }
private string[] Split(string s) { return s.Split(separator, removeOp); }
private bool Enqueue()
{
if (i < A.Length) return true;
string line = reader.ReadLine();
if (line == null) return false;
if (line == "") return Enqueue();
A = Split(line);
i = 0;
return true;
}
private string Dequeue() { Enqueue(); return A[i++]; }
}
eitaho