結果
| 問題 |
No.17 2つの地点に泊まりたい
|
| コンテスト | |
| ユーザー |
kotamanegi
|
| 提出日時 | 2017-03-14 22:25:04 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 4 ms / 5,000 ms |
| コード長 | 1,923 bytes |
| コンパイル時間 | 942 ms |
| コンパイル使用メモリ | 102,992 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-10-15 01:39:51 |
| 合計ジャッジ時間 | 1,740 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 27 |
ソースコード
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <algorithm>
#include <utility>
#include <functional>
#include <cstring>
#include <queue>
#include <stack>
#include <math.h>
#include <iterator>
#include <vector>
#include <string>
#include <set>
#include <math.h>
#include <iostream>
#include<map>
#include <iomanip>
#include <time.h>
#include <random>
#include <stdlib.h>
#include <list>
#include <typeinfo>
#include <list>
#include <set>
using namespace std;
#define LONG_INF 10000000000000000
#define MAX_MOD 1000000007
#define REP(i,n) for(long long i = 0;i < n;++i)
vector<pair<int, int>> vertexs[2000];
long long stay[2000] = {};
long long distances[100][100] = {};
int main() {
int n;
cin >> n;
REP(i, n) {
cin >> stay[i];
}
int m;
cin >> m;
REP(i, m) {
int a, b, c;
cin >> a >> b >> c;
vertexs[a].push_back(make_pair(b, c));
vertexs[b].push_back(make_pair(a, c));
}
REP(i, 100) {
REP(q, 100) {
distances[i][q] = 100000000;
}
}
for (int i = 0;i < n;++i) {
priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> now;
now.push(make_pair(0, i));
distances[i][i] = 0;
while (now.empty() == false) {
pair<long long, int> wow = now.top();
now.pop();
if (distances[i][wow.second] == wow.first) {
for (int q = 0;q < vertexs[wow.second].size();++q) {
if (distances[i][vertexs[wow.second][q].first] > wow.first + vertexs[wow.second][q].second) {
distances[i][vertexs[wow.second][q].first] = wow.first + vertexs[wow.second][q].second;
now.push(make_pair(wow.first + vertexs[wow.second][q].second, vertexs[wow.second][q].first));
}
}
}
}
}
long long ans = 100000000;
for (int i = 1;i < n-1;++i) {
for (int q = 1;q < n - 1;++q) {
if (i != q) {
ans = min(ans, distances[0][i] + distances[i][q] + distances[q][n - 1] + stay[i] + stay[q]);
}
}
}
cout << ans << endl;
return 0;
}
kotamanegi