№ |
Отправитель |
Задача |
Язык |
Вердикт |
Время |
Память |
Отослано |
Протест. |
|
59640780 |
Дорешивание:
qyj060604 |
8C
- 28
|
GNU C++11
|
Превышено ограничение времени на тесте 12
|
4000 мс
|
197008 КБ
|
2019-08-29 04:16:24 |
2019-08-29 04:16:25 |
|
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=30;
struct node{
int x,y;
}s[N];
ll f[1<<24|1];
int pre[1<<24|1];
ll dis[N][N];
int n;
inline void print(int state){
if(state==0){
printf("0 ");
return;
}
print(pre[state]);
for(int i=1;i<=n;i++){
if((state|(1<<(i-1)))==state&&(pre[state]|(1<<(i-1)))!=pre[state]){
printf("%d ",i);
}
}
printf("0 ");
}
int main(){
memset(f,127,sizeof(f));
ll opt=f[0];
scanf("%d%d",&s[0].x,&s[0].y);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&s[i].x,&s[i].y);
}
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
dis[i][j]=(ll)(s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y);
}
}
f[0]=0;
for(int i=0;i<=(1<<n)-1;i++){
if(f[i]==opt) continue;
for(int j=1;j<=n;j++){
if((i|(1<<(j-1)))==i){
continue;
}
for(int k=1;k<=n;k++){
if((i|(1<<(k-1)))==i){
continue;
}
ll u=f[i]+dis[0][j]+dis[j][k]+dis[k][0];
ll state=(i|(1<<(j-1))|(1<<(k-1)));
if(u<f[state]){
f[state]=u;
pre[state]=i;
}
}
}
}
printf("%lld\n",f[(1<<n)-1]);
print((1<<n)-1);
printf("\n");
return 0;
}
Время: ? ms, память: ? КБ