結果
| 問題 |
No.95 Alice and Graph
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2014-12-07 23:58:12 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 377 ms / 5,000 ms |
| コード長 | 1,739 bytes |
| コンパイル時間 | 720 ms |
| コンパイル使用メモリ | 62,816 KB |
| 実行使用メモリ | 9,620 KB |
| 最終ジャッジ日時 | 2024-11-14 13:29:24 |
| 合計ジャッジ時間 | 2,829 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 14 |
ソースコード
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
const int INF = 1 << 28;
const int N_MAX = 66;
int dist[N_MAX][N_MAX];
int dp[1<<18][18];
bool can(vector<int> vs, int K){
int N = (int)vs.size();
for(int mask=0;mask<1<<N;mask++)for(int i=0;i<N;i++)dp[mask][i] = INF;
dp[1<<0][0] = 0;
for(int mask=1;mask<1<<N;mask++)for(int last=0;last<N;last++)if(dp[mask][last] != INF){
for(int next=0;next<N;next++){
if((mask >> next) & 1)continue;
int v = vs[last];
int u = vs[next];
dp[mask | (1 << next)][next] = min(dp[mask | (1 << next)][next], dp[mask][last] + dist[v][u]);
}
}
for(int last=0;last<N;last++){
if(dp[(1 << N) - 1][last] <= K)return true;
}
return false;
}
int main(){
for(int i=0;i<N_MAX;i++)for(int j=0;j<N_MAX;j++)dist[i][j] = INF;
for(int i=0;i<N_MAX;i++)dist[i][i] = 0;
int N, M, K;
cin >> N >> M >> K;
for(int i=0;i<M;i++){
int U, V;
cin >> U >> V;
--U;
--V;
dist[U][V] = 1;
dist[V][U] = 1;
}
for(int k=0;k<N;k++)for(int i=0;i<N;i++)for(int j=0;j<N;j++){
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
vector<int> use;
use.push_back(0);
for(int v=N-1;v>0 && use.size() - 1 < K;v--){
use.push_back(v);
if(!can(use, K)){
use.pop_back();
}
}
ll res = 0;
for(int v : use){
res += (1ll << v) - 1;
}
cout << res << endl;
return 0;
}