답안 #130644

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
130644 2019-07-15T19:00:41 Z SpeedOfMagic 악어의 지하 도시 (IOI11_crocodile) C++17
0 / 100
7 ms 4216 KB
#include "crocodile.h"
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const int N = 1e5 + 1;
const ll inf = 1e9;
vector<pair<int, int>> g[N]; //init me

ll res[N];
pair<int, int> rf[N];
void dijkstra(int st) {
	for (int i = 0; i < N; i++) {
		rf[i] = {-1, -1};
		res[i] = inf;
	}
	res[st] = 0;
	
    priority_queue<pair<int, int>> nxt;
    nxt.push({-res[st], st});

    while (!nxt.empty()) {
        int cur = nxt.top().second;
        int cost = -nxt.top().first;
        nxt.pop();
        if (cost != res[cur])
            continue;

        for (pair<int, int> i : g[cur])
            if (res[i.first] > cost + i.second) {
                res[i.first] = cost + i.second;
				rf[i.first] = {cur, i.second};
                nxt.push({-res[i.first], i.first});
            }
    }
}

int travel_plan(int N, int M, int R[][2], int L[], int K, int P[]) {
	for (int i = 0; i < M; i++) {
		g[R[i][0]].push_back({R[i][1], L[i]});
		g[R[i][1]].push_back({R[i][0], L[i]});
	}
	dijkstra(0);
	char exit[N];
	memset(exit, 0, sizeof exit);
	for (int i = 0; i < K; i++)
		exit[P[i]] = 1;
	
	char rem[N];
	memset(rem, 0, sizeof rem);
	for (bool again = 1; again;) {
		again = 0;
		dijkstra(0);
		int opt = -1;
		for (int i = 0; i < N; i++)
			if (exit[i] && (opt == -1 || res[opt] > res[i]))
				opt = i;
		//cout << res[opt] << " " << opt << endl;
		while (rf[opt].first != -1) {
			int prev = rf[opt].first;
			//cout << prev << endl;
			if (!rem[prev]) {
				again = 1;
				vector<pair<int, int>> nxtVec;
				bool erased = 0;
				for (auto i : g[prev])
					if (!erased && i.first == opt && i.second == rf[opt].second)
						erased = 1;
					else
						nxtVec.push_back(i);
				assert(erased);
				rem[prev] = 1;
				g[prev] = nxtVec;
			}
			opt = prev;
		}
	}
	
	dijkstra(0);
	int ans = inf;
	for (int i = 0; i < N; i++)
		if (exit[i] && (ans > res[i]))
			ans = res[i];
	
	return ans;
}

//31 11
//g++ -std=c++14 grader.cpp crocodile.cpp
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 4216 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 4216 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 4216 KB Output isn't correct
2 Halted 0 ms 0 KB -