結果
| 問題 | No.2565 はじめてのおつかい |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-12-02 17:25:58 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 73 ms / 2,000 ms |
| コード長 | 3,717 bytes |
| コンパイル時間 | 1,177 ms |
| コンパイル使用メモリ | 104,440 KB |
| 実行使用メモリ | 9,124 KB |
| 最終ジャッジ日時 | 2024-09-26 21:13:00 |
| 合計ジャッジ時間 | 4,678 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 50 |
ソースコード
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<vector>
#include<tuple>
#include<math.h>
#include<numeric>
#include<set>
#include<climits>
#include<map>
#include<stack>
#include<queue>
#include <unordered_set>
#include <algorithm>
#include <climits>
#include <cstdio>
#include <set>
#include <utility>
//
//多分勝ちましたーwww
//
//うえーい
//
//
using namespace std;
typedef long long ll;
typedef long double ld;
using Graph = vector<vector<int>>;
using vi = vector<int>;
using vll = vector<long long>;
using vs = vector<string>;
using pii = pair<int, int>;
using pll = pair<long long, long long>;
template <typename T>
bool chmax(T& a, const T& b) { if (a < b) { a = b;return true; }return false; }
template <typename T>
bool chmin(T& a, const T& b) { if (a > b) { a = b;return true; }return false; }
#define YN(bool) if(bool){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}
#define reps(i, a, n) for (int i = (a); i < (int)(n); ++i)
#define rep(i, n) reps(i, 0, n)
#define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; i--)
#define ALL(box) (box).begin(),(box).end()
#define all(box) (box).begin(),(box).end()
#define RALL(box) (box).rbegin(),(box).rend()
#define ft first
#define sd second
#define pb push_back
//#define mp make_pair
#define pqueue priority_queue
//sort(box.begin(), box.end());
//sort(box.rbegin(), box.rend());
//vector<vector<int>> box( a , vector<int>( a ));
//printf("%.7Lf", n);
//reverse(t.begin(), t.end());
//auto It = lower_bound(ALL(box), n);以上 4
//auto It = upper_bound(ALL(box), n);含まない上 7
//cout << box.end() - It ; 末尾までの距離
//cout << It - a.begin() ; 先頭までの距離
//auto It =box.upper_bound( k);set,multiset
// vector<vector<vector<bool>>> flag(350, vector<vector<bool>> 350, vector<bool,false>(350)));
//pqueue < int, vector<int>, greater<int>> q;
vector<vector<char>> migi(vector<vector<char>>& grid) {
int N = grid.size();
// 回転後の新しいグリッドを生成
vector<vector<char>> rotatedGrid(N, vector<char>(N, 0));
// 右に90度回転させる処理
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
rotatedGrid[i][j] = grid[N - 1 - j][i];
}
}
return rotatedGrid;
}
ll sum = 0;
ll num = 0;
int pum = 0;
ll mum = 0;
int min1 = 1000000001;
int max1 = -2;
ll min2 = 9223372036854775807;
ll max2 = -10000000000000000;
ll MOD1 = 1000000007;
ll MOD = 998244353;
int Graph_saitan(const vector<vector<int>>& box, int a1, int a2) {
queue<int> st;
st.push(a1);
vector<int> saitan(box.size(),20000000);
saitan[a1] = 0;
while (!st.empty()) {
int p = st.front();
st.pop();
rep(i, box[p].size()) {
if (saitan[box[p][i]] > saitan[p] + 1) {
st.push(box[p][i]);
saitan[box[p][i]] = saitan[p] + 1;
}
}
if (saitan[a2] != 20000000) {
return saitan[a2];
}
}
return -2;
}
int main() {
int a, b;
cin >> a >> b;
Graph box(a + 1);
rep(i, b) {
int l, m;
cin >> l >> m;
l--;
m--;
box[l].push_back(m);
}
vector<int> f(3), f2(3);
int ans = 20000000;
f[0] = Graph_saitan(box, 0, a - 2);
f[1] = Graph_saitan(box, a - 2, a - 1);
f[2] = Graph_saitan(box, a - 1, 0);
f2[0] = Graph_saitan(box, 0, a - 1);
f2[1] = Graph_saitan(box, a - 1, a - 2);
f2[2] = Graph_saitan(box, a - 2, 0);
rep(i, 3) {
//cout << f[i] << " ";
}
rep(i, 3) {
//cout << f2[i] << " ";
}
bool ok=true;
int sum1 = 0, sum2 = 0;
rep(i, f.size()) {
if (f[i] == -2) {
ok = false;
}
sum1 += f[i];
}
if (ok) {
ans = min(ans, sum1);
}
ok = true;
rep(i, f2.size()) {
if (f2[i] == -2) {
ok = false;
}
sum2 += f2[i];
}
if (ok) {
ans = min(ans, sum2);
}
if (ans == 20000000) {
cout << -1;
}
else {
cout << ans;
}
}