답안 #56205

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
56205 2018-07-10T08:50:24 Z 윤교준(#1582) Cities (BOI16_cities) C++11
22 / 100
6000 ms 47476 KB
#include <bits/stdc++.h>
#define rf(x) (x)=0;while(*p<48)p++;while(47<*p)(x)=((x)<<3)+((x)<<1)+(*p++&15);
#define pb push_back
#define eb emplace_back
#define sz(V) ((int)(V).size())
#define allv(V) ((V).begin()),((V).end())
#define befv(V) ((V)[(sz(V)-2)])
#define sorv(V) sort(allv(V))
#define revv(V) reverse(allv(V))
#define univ(V) (V).erase(unique(allv(V)),(V).end())
#define clv(V) (V).clear()
#define upmin(a,b) (a)=min((a),(b))
#define upmax(a,b) (a)=max((a),(b))
#define rb(x) ((x)&(-(x)))
#define INF (0x3f3f3f3f)
#define INFLL (0x3f3f3f3f3f3f3f3fll)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
static unsigned char str[22000022], *p=str;
void fg(vector<pii> G[], int a, int b, int c) { G[a].eb(b, c); G[b].eb(a, c); }
const int MAXN = 100005;
const int MAXM = 200005;

vector<pii> G[MAXN];

vector<int> KV[1<<5];

ll dp[MAXN][1<<5];

int A[MAXM], B[MAXM], C[MAXM];
int D[MAXN];

ll Ans = INFLL;
int N, M, K;

ll f(int i, int key) {
	if(D[i] && (key & (1<<(D[i]-1)))) key ^= (1<<(D[i]-1));
	ll &ret = dp[i][key];
	if(ret < 0) return INFLL;
	if(ret < INFLL) return ret;
	ret = -1;

	ll ans = INFLL;
	for(auto &e : G[i]) {
		for(int nk : KV[key]) {
			ll t = f(e.first, nk) + f(i, key ^ nk) + e.second;
			upmin(ans, t);
		}
	}
	ret = ans;
	return ret;
}

int main() {
	fread(str, 1, 22000022, stdin);
	rf(N) rf(K) rf(M)

	for(int i = 1, c; i <= K; i++) {
		rf(c)
		D[c] = i;
	}
	for(int i = 1; i <= M; i++) {
		rf(A[i]) rf(B[i]) rf(C[i])
		fg(G, A[i], B[i], C[i]);
	}

	for(int key = 1; key < (1<<K); key++)
		for(int a = 1; a <= key; a++)
			if((key & a) == a)
				KV[key].pb(a);

	for(int i = 1; i <= N; i++)
		fill(dp[i]+1, dp[i]+(1<<K), INFLL);

	for(int i = 1; i <= N; i++)
		upmin(Ans, f(i, (1<<K)-1));
	cout << Ans << endl;
	return 0;
}

Compilation message

cities.cpp: In function 'int main()':
cities.cpp:57:7: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
  fread(str, 1, 22000022, stdin);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2676 KB Output is correct
2 Correct 4 ms 2676 KB Output is correct
3 Correct 6 ms 2828 KB Output is correct
4 Correct 5 ms 2828 KB Output is correct
5 Correct 5 ms 2828 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 6070 ms 47304 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 6054 ms 47304 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 6031 ms 47476 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 6071 ms 47476 KB Time limit exceeded
2 Halted 0 ms 0 KB -