結果
| 問題 |
No.160 最短経路のうち辞書順最小
|
| コンテスト | |
| ユーザー |
lzy9
|
| 提出日時 | 2018-03-19 13:52:48 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,958 bytes |
| コンパイル時間 | 3,852 ms |
| コンパイル使用メモリ | 115,504 KB |
| 実行使用メモリ | 32,820 KB |
| 最終ジャッジ日時 | 2024-12-31 10:43:22 |
| 合計ジャッジ時間 | 5,644 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 8 WA * 18 |
コンパイルメッセージ
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.Collections.Generic;
class Program
{
static int[] dx = new int[] { 0, 0, 1, -1 };
static int[] dy = new int[] { 1, -1, 0, 0 };
const int INF = 1010101010;
static void Solve()
{
var n = sc.Int();
var m = sc.Int();
var s = sc.Int();
var g = sc.Int();
var nodes = new List<List<Edge>>();
for (int i = 0; i < n; i++)
nodes.Add(new List<Edge>());
var pre = new int[n];
for (int i = 0; i < m; i++)
{
var a = sc.Int();
var b = sc.Int();
var c = sc.Int();
nodes[a].Add(new Edge { To = b, Cost = c });
nodes[b].Add(new Edge { To = a, Cost = c });
}
var used = new bool[n];
var cost = new int[n];
for (int i = 0; i < n; i++) {
cost[i] = INF;
pre[i] = i;
}
cost[s] = 0;
for (int i = 0; i < n; i++) {
var next = g;
for (int j = 0; j < n; j++) {
if (!used[j] && cost[j] < cost[next])
next = j;
}
used[next] = true;
foreach(var e in nodes[next]) {
if (cost[next] + e.Cost < cost[e.To]) {
cost[e.To] = cost[next] + e.Cost;
pre[e.To] = next;
}
if (cost[next] + e.Cost == cost[e.To])
pre[e.To] = Math.Min(pre[e.To], next);
}
}
var path = new Stack<int>();
path.Push(g);
while (path.Peek() != s)
path.Push(pre[path.Peek()]);
while(path.Count != 0)
pr.Write($"{path.Pop()} ");
}
class Edge
{
public int To;
public int Cost;
}
static double F(double prev, double next, double t)
{
return Math.Pow(Math.Exp((next - prev) / t), 2);
}
static int[,] Mul(int[,] a, int[,] b)
{
var ret = new int[a.GetLength(0), b.GetLength(1)];
for (int i = 0; i < a.GetLength(0); i++)
for (int j = 0; j < b.GetLength(1); j++)
for (int k = 0; k < a.GetLength(1); k++)
ret[i, j] += a[i, k] * b[k, j];
return ret;
}
static int[,] Pow(int[,] a, int n)
{
var b = new int[a.GetLength(1), a.GetLength(0)];
var f = n % 2 == 1;
for (int i = 0; i < a.GetLength(0); i++)
b[i, i] = 1;
while (n > 0)
{
if (n % 2 == 1)
b = Mul(a, b);
n >>= 1;
}
return b;
}
class Coord
{
public int x;
public int y;
}
static void Main(string[] args)
{
// pr.AutoFlush = true;
Solve();
pr.Flush();
// Console.ReadKey();
}
static Scanner sc = new Scanner();
static Printer pr = new Printer();
}
#region IO
class Scanner
{
private int _i = 0;
private string[] line = new string[0];
private T[] Enumerate<T>(int n, Func<T> f)
{
T[] ret = new T[n];
for (int i = 0; i < n; i++)
ret[i] = f();
return ret;
}
public string Str()
{
if (line.Length <= _i)
{
line = Console.ReadLine().Split(' ');
_i = 0;
}
return line[_i++];
}
public int Int() => int.Parse(Str());
public long Long() => long.Parse(Str());
public double Double() => double.Parse(Str());
public int[] Int(int n) => Enumerate(n, Int);
public long[] Long(int n) => Enumerate(n, Long);
public double[] Double(int n) => Enumerate(n, Double);
public string[] Str(int n) => Enumerate(n, Str);
}
class Printer : StreamWriter
{
public Printer() : base(Console.OpenStandardOutput())
{
AutoFlush = false;
}
}
#endregion
lzy9