結果
| 問題 |
No.468 役に立つ競技プログラミング実践編
|
| コンテスト | |
| ユーザー |
14番
|
| 提出日時 | 2016-12-18 10:21:06 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
AC
|
| 実行時間 | 966 ms / 2,000 ms |
| コード長 | 3,457 bytes |
| コンパイル時間 | 1,219 ms |
| コンパイル使用メモリ | 118,676 KB |
| 実行使用メモリ | 97,276 KB |
| 最終ジャッジ日時 | 2024-12-14 07:53:48 |
| 合計ジャッジ時間 | 13,443 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 31 |
| other | AC * 6 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
public class Program
{
public void Proc() {
Reader.IsDebug = false;
int[] inpt = Reader.ReadLine().Split(' ').Select(a=>int.Parse(a)).ToArray();
this.MemberCount = inpt[0];
this.PathCount = inpt[1];
this.maxCost = new long[this.MemberCount].Select(a=>(long)-1).ToArray();
this.minCost.Add(0,0);
for(int i=0; i<this.PathCount; i++) {
inpt = Reader.ReadLine().Split(' ').Select(a=>int.Parse(a)).ToArray();
if(!this.PathDic.ContainsKey(inpt[0])) {
this.PathDic.Add(inpt[0], new Dictionary<int, int>());
}
this.PathDic[inpt[0]].Add(inpt[1], inpt[2]);
if(!this.PathRev.ContainsKey(inpt[1])) {
this.PathRev.Add(inpt[1], new Dictionary<int, int>());
}
this.PathRev[inpt[1]].Add(inpt[0], inpt[2]);
}
Queue<int> que = new Queue<int>();
PathDic[0].Keys.ToList().ForEach(a=>que.Enqueue(a));
while(que.Count > 0) {
int cur = que.Dequeue();
if(minCost.ContainsKey(cur)) {
continue;
}
if(PathRev[cur].Any(a=>!minCost.ContainsKey(a.Key))) {
continue;
}
minCost[cur] = PathRev[cur].Max(a=>minCost[a.Key] + a.Value);
if(cur == this.MemberCount - 1) {
continue;
}
PathDic[cur].ToList().ForEach(a=>que.Enqueue(a.Key));
}
maxCost[this.MemberCount-1] = minCost[this.MemberCount-1];
que.Clear();
PathRev[this.MemberCount-1].ToList().ForEach(a=>{
que.Enqueue(a.Key);
});
while(que.Count > 0) {
int cur = que.Dequeue();
if(maxCost[cur] >= 0) {
continue;
}
if(PathDic[cur].Any(a=>maxCost[a.Key] < 0)) {
continue;
}
maxCost[cur] = PathDic[cur].Min(a=>maxCost[a.Key] - a.Value);
if(cur == 0) {
continue;
}
PathRev[cur].ToList().ForEach(a=>que.Enqueue(a.Key));
}
string ans = minCost[this.MemberCount-1] + " " + minCost.Count(a=>a.Value != maxCost[a.Key]) + "/" + this.MemberCount;
Console.WriteLine(ans);
}
private Dictionary<int, Dictionary<int, int>> PathDic = new Dictionary<int, Dictionary<int, int>>();
private Dictionary<int, Dictionary<int, int>> PathRev = new Dictionary<int, Dictionary<int, int>>();
private Dictionary<int, long> minCost = new Dictionary<int, long>();
private long[] maxCost;
private int MemberCount;
private int PathCount;
public class Reader {
public static bool IsDebug = true;
private static System.IO.StringReader SReader;
private static string InitText = @"
8 12
0 1 3
0 2 3
1 3 3
1 4 3
2 3 3
2 4 3
3 5 3
3 6 3
4 5 3
4 6 3
5 7 3
6 7 3
";
public static string ReadLine() {
if(IsDebug) {
if(SReader == null) {
SReader = new System.IO.StringReader(InitText.Trim());
}
return SReader.ReadLine();
} else {
return Console.ReadLine();
}
}
}
public static void Main(string[] args)
{
Program prg = new Program();
prg.Proc();
}
}
14番