結果

問題 No.160 最短経路のうち辞書順最小
ユーザー AreTrash
提出日時 2016-09-01 04:04:40
言語 C#(csc)
(csc 3.9.0)
結果
TLE  
実行時間 -
コード長 5,765 bytes
コンパイル時間 1,340 ms
コンパイル使用メモリ 113,020 KB
実行使用メモリ 587,164 KB
最終ジャッジ日時 2024-11-14 14:04:21
合計ジャッジ時間 113,530 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 7 TLE * 18 MLE * 1
権限があれば一括ダウンロードができます
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc)
Copyright (C) Microsoft Corporation. All rights reserved.

ソースコード

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

using System;
using System.Collections;
using System.Collections.Generic;
namespace No160{
public class Program{
public static void Main(string[] args){
var sr = new StreamReader();
//---------------------------------
var N = sr.Next<int>();
var M = sr.Next<int>();
var S = sr.Next<int>();
var G = sr.Next<int>();
var dj = new Dijkstra(N);
for(var i = 0; i < M; i++){
var A = sr.Next<int>();
var B = sr.Next<int>();
var C = sr.Next<int>();
dj.AddEdge(A, B, C);
dj.AddEdge(B, A, C);
}
var dist = dj.Solve(G);
var res = new List<int>();
var now = S;
while(now != G){
res.Add(now);
var next = int.MaxValue;
foreach(var edge in dj.Adj[now]){
if(dist[now] == dist[edge.To] + edge.Cost){
next = Math.Min(next, edge.To);
}
}
now = next;
}
res.Add(G);
Console.WriteLine(string.Join(" ", res));
//---------------------------------
}
}
public class Edge{
public int To;
public int Cost;
}
public class Node : IComparable<Node>{
public int Id;
public int Cost;
public int CompareTo(Node node){
return Math.Sign(Cost - node.Cost);
}
}
public class Dijkstra{
public readonly List<Edge>[] Adj;
public Dijkstra(int v){
Adj = new List<Edge>[v];
for(var i = 0; i < v; i++) Adj[i] = new List<Edge>();
}
public void AddEdge(int from, int to, int cost){
Adj[from].Add(new Edge{To = to, Cost = cost});
}
public int[] Solve(int start){
var v = Adj.Length;
var used = new bool[v];
var res = new int[v];
for(var i = 0; i < v; i++) res[i] = int.MaxValue;
res[start] = 0;
var pq = new PriorityQueue<Node>();
pq.Enqueue(new Node{Id = start, Cost = 0});
while(pq.Count > 0){
var stat = pq.Dequeue();
var from = stat.Id;
used[from] = true;
foreach(var edge in Adj[from]){
var to = edge.To;
var cost = stat.Cost + edge.Cost;
if(used[to] || cost > res[to]) continue;
res[to] = cost;
pq.Enqueue(new Node{Id = to, Cost = cost});
}
}
return res;
}
}
public class PriorityQueue<T> : IEnumerable<T> where T : IComparable<T>{
private readonly List<T> _list = new List<T>();
public int Count => _list.Count;
IEnumerator<T> IEnumerable<T>.GetEnumerator(){
return _list.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator(){
return _list.GetEnumerator();
}
public void Clear(){
_list.Clear();
}
public bool Contains(T value){
return _list.Contains(value);
}
public T Peek(){
return _list[0];
}
public void Enqueue(T value){
_list.Add(value);
PushHeap();
}
public T Dequeue(){
var ret = _list[0];
_list[0] = _list[Count - 1];
_list.RemoveAt(Count - 1);
PopHeap();
return ret;
}
private void PushHeap(){
var i = Count - 1;
while(i != 0){
var p = (i - 1) / 2;
if(_list[i].CompareTo(_list[p]) > 0) return;
SwapIndex(i, i = p);
}
}
private void PopHeap(){
var i = 0;
while(true){
var l = 2 * i + 1;
var r = l + 1;
var maxi = i;
if(l < Count && _list[maxi].CompareTo(_list[l]) > 0) maxi = l;
if(r < Count && _list[maxi].CompareTo(_list[r]) > 0) maxi = r;
if(maxi == i) return;
SwapIndex(i, i = maxi);
}
}
private void SwapIndex(int left, int right){
var tmp = _list[left];
_list[left] = _list[right];
_list[right] = tmp;
}
}
public class StreamReader{
private readonly char[] _c = {' '};
private int _index = -1;
private string[] _input = new string[0];
public T Next<T>(){
if(_index == _input.Length - 1){
_index = -1;
while(true){
string rl = Console.ReadLine();
if(rl == null){
if(typeof(T).IsClass) return default(T);
return (T)typeof(T).GetField("MinValue").GetValue(null);
}
if(rl != ""){
_input = rl.Split(_c, StringSplitOptions.RemoveEmptyEntries);
break;
}
}
}
return (T)Convert.ChangeType(_input[++_index], typeof(T), System.Globalization.CultureInfo.InvariantCulture);
}
public T[] Next<T>(int x){
var ret = new T[x];
for(var i = 0; i < x; ++i) ret[i] = Next<T>();
return ret;
}
public T[][] Next<T>(int y, int x){
var ret = new T[y][];
for(var i = 0; i < y; ++i) ret[i] = Next<T>(x);
return ret;
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0