这是不能过的:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
using LL = long long;
mt19937_64 rd(time(0));
constexpr int N = 3e5 + 5, mod = 998244353;
constexpr double eps = 1e-8;
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#define fi first
#define se second
#define int long long
#define lowbit(x) (x & (-x))
#define PII pair<int, int>
#define mid ((l + r) >> 1)
// int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int ksm(int a, int b){
a %= mod;
int res = 1;
while(b){
if(b & 1)res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int n, m;
double g[22][22];
double lim;
double x[N], y[N];
void Sakuya()
{
cin >> n >> lim;
for(int i = 1; i <= n; ++ i){
cin >> x[i] >> y[i];
}
auto get = [&](int id1, int id2) -> double {
return sqrt((x[id1] - x[id2]) * (x[id1] - x[id2]) + (y[id1] - y[id2]) * (y[id1] - y[id2]));
};
for(int i = 1; i <= n; ++ i){
for(int j = 1; j <= n; ++ j){
g[i][j] = get(i, j);
}
}
for(int k = 1; k <= n; ++ k){
for(int i = 1; i <= n; ++ i){
for(int j = 1; j <= n; ++ j){
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
}
}
}
for(int i = 1; i <= n; ++ i){
for(int j = 1; j <= n; ++ j){
if(g[i][j] > lim)g[i][j] = 1e18;
}
}
vector dp(1 << n, vector<double>(n + 1, 1e18));
dp[1 << (1 - 1)][1] = 0;
for(int S = 0; S < (1 << n); ++ S){
for(int i = 1; i <= n; ++ i){
if(!((S >> (i - 1)) & 1))continue;
for(int j = 1; j <= n; ++ j){
if(!((S >> (j - 1)) & 1))continue;
dp[S][i] = min(dp[S][i], dp[S ^ (1 << (i - 1))][j] + g[j][i]);
}
}
}
double ans = 1e18;
int U = (1 << n) - 1;
for(int i = 2; i <= n; ++ i){
ans = min(ans, dp[U][i] + g[i][1]);
ans = min(ans, 2 * dp[U][i]);
}
cout << fixed << setprecision(2) << ans << "\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
// int T;
// for (cin >> T; T -- ; )
Sakuya();
}
这是能过得:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
using LL = long long;
mt19937_64 rd(time(0));
constexpr int N = 3e5 + 5, mod = 998244353;
constexpr double eps = 1e-8;
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#define fi first
#define se second
#define int long long
#define lowbit(x) (x & (-x))
#define PII pair<int, int>
#define mid ((l + r) >> 1)
// int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int ksm(int a, int b){
a %= mod;
int res = 1;
while(b){
if(b & 1)res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int n, m;
double g[22][22];
double lim;
double x[N], y[N];
void Sakuya()
{
cin >> n >> lim;
for(int i = 1; i <= n; ++ i){
cin >> x[i] >> y[i];
}
auto get = [&](int id1, int id2) -> double {
return sqrt((x[id1] - x[id2]) * (x[id1] - x[id2]) + (y[id1] - y[id2]) * (y[id1] - y[id2]));
};
for(int i = 1; i <= n; ++ i){
for(int j = 1; j <= n; ++ j){
g[i][j] = get(i, j);
}
}
for(int i = 1; i <= n; ++ i){
for(int j = 1; j <= n; ++ j){
if(g[i][j] > lim)g[i][j] = 1e18;
}
}
for(int k = 1; k <= n; ++ k){
for(int i = 1; i <= n; ++ i){
for(int j = 1; j <= n; ++ j){
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
}
}
}
vector dp(1 << n, vector<double>(n + 1, 1e18));
dp[1 << (1 - 1)][1] = 0;
for(int S = 0; S < (1 << n); ++ S){
for(int i = 1; i <= n; ++ i){
if(!((S >> (i - 1)) & 1))continue;
for(int j = 1; j <= n; ++ j){
if(!((S >> (j - 1)) & 1))continue;
dp[S][i] = min(dp[S][i], dp[S ^ (1 << (i - 1))][j] + g[j][i]);
}
}
}
double ans = 1e18;
int U = (1 << n) - 1;
for(int i = 2; i <= n; ++ i){
ans = min(ans, dp[U][i] + g[i][1]);
ans = min(ans, 2 * dp[U][i]);
}
cout << fixed << setprecision(2) << ans << "\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
// int T;
// for (cin >> T; T -- ; )
Sakuya();
}
然后奇怪得一件事情就是 我不给不满足条件的赋值1e18 变成 我中间和最后转移得时候多加一个条件判断能不能转移也是90pts 第四个点一直wa