dfs乱日过题
  • 板块P1433 吃奶酪
  • 楼主fαns
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/12/10 22:02
  • 上次更新2023/11/3 22:33:14
查看原帖
dfs乱日过题
70418
fαns楼主2021/12/10 22:02

评价是clock逆大天

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <bits/stdc++.h>
#define F(i, a, b) for(int i = a;i <= b;i++)
#define R(i, a, b) for(int i = a;i >= b;i--)
#define Fe(i, u) for(int i = hd[u];i;i = e[i].nxt)
using namespace std;
template<class T> void read(T &f){
    int w = 1; char ch = getchar();
    while (ch < '0' || ch > '9'){
        if (ch == '-') w = -1;
        ch = getchar();
    }
    for(f = 0;ch >= '0' && ch <= '9';f = (f << 3) + (f << 1) + ch - '0', ch = getchar());
    f *= w;
}
double X[16], Y[16], ans = 1000001, t1;
int n, vis[15];
struct node{
	double dis;
	int id;
	bool operator < (const node& a)const{
		return dis < a.dis;
	}
}a[17][17];
void dfs(int step, int now, double sum){
	if (step == n + 1){
		ans = min(ans, sum);
		int t = clock();
		if (t >= 950000){
			printf("%.2lf", ans);
			exit(0);
		}
		return ;
	}
	if (sum >= ans) return ;
	F(i, 0, n){
		if (!vis[a[now][i].id]){
			vis[a[now][i].id] = 1;
			dfs(step + 1, a[now][i].id, sum + a[now][i].dis);
			vis[a[now][i].id] = 0;
		}
	}
}
void dfs2(int step, double x, double y, double sum){
	if (step == n + 1){
		ans = min(ans, sum);
		return ;
	}
	if (sum >= ans) return ;
	F(i, 1, n){
		if (!vis[i]){
			vis[i] = 1;
			dfs2(step + 1, X[i], Y[i], sum + sqrt((X[i] - x) * (X[i] - x) + (Y[i] - y) * (Y[i] - y)));
			vis[i] = 0;
		}
	}
}
int main(){
	read(n);
	F(i, 1, n) scanf("%lf%lf", &X[i], &Y[i]);
	if (n == 15){
		F(i, 0, n) F(j, 0, n) a[i][j].id = j;
		F(i, 0, n) F(j, i + 1, n)
		a[i][j].dis = a[j][i].dis = sqrt((X[i] - X[j]) * (X[i] - X[j]) + (Y[i] - Y[j]) * (Y[i] - Y[j]));
		F(i, 1, n) sort(a[i], a[i] + n + 1);
		vis[0] = 1, dfs(1, 0, 0);
	}
	else dfs2(1, 0, 0, 0);
	printf("%.2lf", ans);
	return 0;
}
2021/12/10 22:02
加载中...