답안 #882287

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
882287 2023-12-03T00:37:30 Z cocohearts Commuter Pass (JOI18_commuter_pass) C++17
100 / 100
246 ms 30644 KB
#include "bits/stdc++.h"
using namespace std;

using ll = long long;
using ld = long double;
using db = double;
using str = string;

using pi = pair<int, int>;
using pl = pair<ll, ll>;
using pd = pair<db, db>;

using vi = vector<int>;
using vvi = vector<vi>;
using vb = vector<bool>;
using vl = vector<ll>;
using vd = vector<db>;
using vs = vector<str>;
using vpi = vector<pi>;
using vpl = vector<pl>;
using vpd = vector<pd>;

#define mp make_pair
#define f first
#define s second

// const int MOD = 1e9 + 7;
// const int MX = 2e5 + 5;
// const int INF = 1e9;
const ll INF = 1e18;  // not too close to LLONG_MAX
// const ld PI = acos((ld)-1);
// const int dx[4] = {1, 0, -1, 0},
//           dy[4] = {0, 1, 0, -1};  // for every grid problem!!

#define sz(x) int(x.size())
#define bg(x) begin(x)
#define all(x) bg(x), end(x)
#define rall(x) x.rbegin(), x.rend()
#define sor(x) sort(all(x))
#define rsz resize
#define ins insert
#define ft front()
#define bk back()
#define pb push_back
#define eb emplace_back
#define pf push_front

#define lb lower_bound
#define ub upper_bound

#define endl "\n"

#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define F0R(i, a) FOR(i, 0, a)
#define ROF(i, a, b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i, a) ROF(i, 0, a)
#define trav(a, x) for (auto &a : x)

template <class T> using pqg = priority_queue<T, vector<T>, greater<T>>;

constexpr int pct(int x) { return (int)__builtin_popcount(x); }
constexpr int bits(int x) {
	return x == 0 ? 0 : 31 - (int)__builtin_clz(x);
}
 
template <typename T, typename... U>
void dbgh(const T& t, const U&... u) {
    cerr << t;
    ((cerr << " | " << u), ...);
    cerr << endl;
}
 
void setPrec() { cout << fixed << setprecision(15); }
void unsyncIO() { cin.tie(0)->sync_with_stdio(0); }

void setIn(str s) { freopen(s.c_str(), "r", stdin); }
void setOut(str s) { freopen(s.c_str(), "w", stdout); }
void setIO(str s = "") {
	unsyncIO();
	setPrec();
	cin.exceptions(cin.failbit);

	if (sz(s)) setIn(s + ".in"), setOut(s + ".out");
}

#ifdef LOCAL
	const int L = 100;
	#define dbg(...)                                           \
		cerr << "L" << __LINE__ << " [" << #__VA_ARGS__ << "]" \
			<< ": ";                                           \
		dbgh(__VA_ARGS__)
#else
	const int L = 100000;
	#define dbg(...)
#endif

vector<pair<ll,int>> adj[L];
vi preds[L];
ll dists[L];
bool solved[L];

ll Udists[L];
ll Vdists[L];

ll Umins[L];
ll Vmins[L];

void Dijkstra(int U, int N, ll Dists[L]) {
	priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> DijQ;
	DijQ.push(mp(0,U));
	F0R(ind,N) {
		Dists[ind] = INF;
		solved[ind] = false;
	}
	Dists[U] = 0;

	while(DijQ.size()) {
		pair<ll,int> newN = DijQ.top(); DijQ.pop();
		ll dist = newN.f; int nd = newN.s;
		if (solved[nd]) continue;
		solved[nd] = true;
		trav(nb,adj[nd]) {
			int nbN = nb.s;
			if (!solved[nbN]) {
				ll nbDist = dist+nb.f;
				if (nbDist < Dists[nbN]) {
					Dists[nbN] = nbDist;
					DijQ.push(mp(nbDist,nbN));
				}
			}
		}
	}
}

ll recurse(int nd, ll Dists[L], ll Mins[L]) {
	// Mins[V] is minimum of Dists for all preds of V
	if (Mins[nd] != INF) return Mins[nd];
	ll ans = Dists[nd];
	trav(pred,preds[nd]) {
		ans = min(ans,recurse(pred,Dists,Mins));
	}
	Mins[nd] = ans;
	return ans;
}

void solve() {
	int N,M,S,T,U,V; cin >> N >> M >> S >> T >> U >> V;
	--S; --T; --U; --V;

	int a,b;
	ll c;
	F0R(_,M) {
		cin >> a >> b >> c;
		--a; --b;
		adj[a].pb(mp(c,b));
		adj[b].pb(mp(c,a));
	}
	// Dijkstra from S, tracking possible predecessors
	priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> DijQ;
	DijQ.push(mp(0,S));
	F0R(ind,N) {
		dists[ind] = INF;
		solved[ind] = false;
	}
	dists[S] = 0;

	while(DijQ.size()) {
		pair<ll,int> newN = DijQ.top(); DijQ.pop();
		ll dist = newN.f; int nd = newN.s;
		if (solved[nd]) continue;
		solved[nd] = true;
		trav(nb,adj[nd]) {
			int nbN = nb.s;
			if (!solved[nbN]) {
				ll nbDist = dist+nb.f;
				if (nbDist < dists[nbN]) {
					dists[nbN] = nbDist;
					preds[nbN] = vi(1,nd);
					DijQ.push(mp(nbDist,nbN));
				} else if (nbDist==dists[nbN]) {
					preds[nbN].pb(nd);
				}
			}
		}
	}
	
	// Dijkstra from U and V
	Dijkstra(U,N,Udists);
	Dijkstra(V,N,Vdists);

	F0R(ind,N) {
		Umins[ind] = Vmins[ind] = INF;
	}

	// find min among all preds
	recurse(T,Udists,Umins);
	recurse(T,Vdists,Vmins);

	ll ans = Udists[V];

	F0R(ind,N) {
		ans = min(ans,Udists[ind]+Vmins[ind]);
		ans = min(ans,Vdists[ind]+Umins[ind]);
	}

	cout << ans;
}

int main() {
	#ifdef LOCAL // call with -DLOCAL
		freopen("../input.txt", "r", stdin);
		freopen("../myoutput.txt", "w", stdout);
		freopen("../debug.txt", "w", stderr);
	#else
		setIO();
	#endif

	solve();
}

Compilation message

commuter_pass.cpp: In function 'void setIn(str)':
commuter_pass.cpp:76:28: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 | void setIn(str s) { freopen(s.c_str(), "r", stdin); }
      |                     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'void setOut(str)':
commuter_pass.cpp:77:29: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 | void setOut(str s) { freopen(s.c_str(), "w", stdout); }
      |                      ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 220 ms 29928 KB Output is correct
2 Correct 184 ms 28176 KB Output is correct
3 Correct 189 ms 30644 KB Output is correct
4 Correct 200 ms 29444 KB Output is correct
5 Correct 205 ms 28020 KB Output is correct
6 Correct 177 ms 30028 KB Output is correct
7 Correct 197 ms 28056 KB Output is correct
8 Correct 180 ms 28020 KB Output is correct
9 Correct 207 ms 28440 KB Output is correct
10 Correct 162 ms 28512 KB Output is correct
11 Correct 64 ms 21844 KB Output is correct
12 Correct 181 ms 28456 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 214 ms 28348 KB Output is correct
2 Correct 206 ms 28420 KB Output is correct
3 Correct 193 ms 27992 KB Output is correct
4 Correct 208 ms 28308 KB Output is correct
5 Correct 191 ms 28680 KB Output is correct
6 Correct 181 ms 30052 KB Output is correct
7 Correct 215 ms 30492 KB Output is correct
8 Correct 210 ms 28344 KB Output is correct
9 Correct 219 ms 28536 KB Output is correct
10 Correct 212 ms 28236 KB Output is correct
11 Correct 89 ms 22944 KB Output is correct
12 Correct 184 ms 30304 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 10760 KB Output is correct
2 Correct 2 ms 8792 KB Output is correct
3 Correct 2 ms 9052 KB Output is correct
4 Correct 13 ms 12376 KB Output is correct
5 Correct 7 ms 10588 KB Output is correct
6 Correct 2 ms 9052 KB Output is correct
7 Correct 4 ms 8968 KB Output is correct
8 Correct 3 ms 9048 KB Output is correct
9 Correct 2 ms 9072 KB Output is correct
10 Correct 9 ms 10588 KB Output is correct
11 Correct 2 ms 8796 KB Output is correct
12 Correct 2 ms 8796 KB Output is correct
13 Correct 2 ms 9052 KB Output is correct
14 Correct 2 ms 9052 KB Output is correct
15 Correct 2 ms 9052 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 220 ms 29928 KB Output is correct
2 Correct 184 ms 28176 KB Output is correct
3 Correct 189 ms 30644 KB Output is correct
4 Correct 200 ms 29444 KB Output is correct
5 Correct 205 ms 28020 KB Output is correct
6 Correct 177 ms 30028 KB Output is correct
7 Correct 197 ms 28056 KB Output is correct
8 Correct 180 ms 28020 KB Output is correct
9 Correct 207 ms 28440 KB Output is correct
10 Correct 162 ms 28512 KB Output is correct
11 Correct 64 ms 21844 KB Output is correct
12 Correct 181 ms 28456 KB Output is correct
13 Correct 214 ms 28348 KB Output is correct
14 Correct 206 ms 28420 KB Output is correct
15 Correct 193 ms 27992 KB Output is correct
16 Correct 208 ms 28308 KB Output is correct
17 Correct 191 ms 28680 KB Output is correct
18 Correct 181 ms 30052 KB Output is correct
19 Correct 215 ms 30492 KB Output is correct
20 Correct 210 ms 28344 KB Output is correct
21 Correct 219 ms 28536 KB Output is correct
22 Correct 212 ms 28236 KB Output is correct
23 Correct 89 ms 22944 KB Output is correct
24 Correct 184 ms 30304 KB Output is correct
25 Correct 7 ms 10760 KB Output is correct
26 Correct 2 ms 8792 KB Output is correct
27 Correct 2 ms 9052 KB Output is correct
28 Correct 13 ms 12376 KB Output is correct
29 Correct 7 ms 10588 KB Output is correct
30 Correct 2 ms 9052 KB Output is correct
31 Correct 4 ms 8968 KB Output is correct
32 Correct 3 ms 9048 KB Output is correct
33 Correct 2 ms 9072 KB Output is correct
34 Correct 9 ms 10588 KB Output is correct
35 Correct 2 ms 8796 KB Output is correct
36 Correct 2 ms 8796 KB Output is correct
37 Correct 2 ms 9052 KB Output is correct
38 Correct 2 ms 9052 KB Output is correct
39 Correct 2 ms 9052 KB Output is correct
40 Correct 199 ms 30328 KB Output is correct
41 Correct 181 ms 28540 KB Output is correct
42 Correct 176 ms 28656 KB Output is correct
43 Correct 66 ms 22356 KB Output is correct
44 Correct 68 ms 22356 KB Output is correct
45 Correct 178 ms 26768 KB Output is correct
46 Correct 246 ms 26936 KB Output is correct
47 Correct 203 ms 29284 KB Output is correct
48 Correct 76 ms 19540 KB Output is correct
49 Correct 167 ms 30608 KB Output is correct
50 Correct 210 ms 27676 KB Output is correct
51 Correct 169 ms 27112 KB Output is correct