Основное
 
 
Отправитель Задача Язык Вердикт Время Память Отослано Протест.  
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, память: ? КБ
Вердикт: ?
Ввод
?
Вывод участника
?
Ответ жюри
?
Комментарий чекера
?
Диагностика
?
Показать детали тестирования