请问这道题用djiskra或floyd预处理两点之间距离然后剪枝为什么会wa
  • 板块P1433 吃奶酪
  • 楼主I_m_FW
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/11/10 18:49
  • 上次更新2023/11/4 00:57:27
查看原帖
请问这道题用djiskra或floyd预处理两点之间距离然后剪枝为什么会wa
445896
I_m_FW楼主2021/11/10 18:49
#include <bits/stdc++.h>
using namespace std;
const int N=20;
const double INF=999999.9;
int x[N],y[N],n;
int h[N],to[N*N],ne[N*N],tot;
double ans=999999.9;
double w[N*N],d[N][N];
bool st[N*N],vis[N];
void add(int x,int y,double z){
	to[++tot]=y;ne[tot]=h[x];w[tot]=z;h[x]=tot;
}
struct node{
	int x;double d;
};
double lens(int i,int j){
	int aa=x[i]-x[j],bb=y[i]-y[j];
	return (double)sqrt((double)aa*aa+(double)bb*bb);
}
bool operator <(node aa,node bb){
	return aa.d>bb.d;
}
void dist(int o){
	for(int i=0;i<=n;i++)d[o][i]=INF;
	memset(st,false,sizeof st);
	priority_queue<node> q;node pp;pp.x=o;pp.d=0;
	d[o][o]=0;
	q.push(pp);
	while(q.size()){
		int u=q.top().x;q.pop();
		if(st[u])continue;
		st[u]=true;
		for(int i=h[u];i;i=ne[i]){
			int y=to[i];
			double e=w[i];
			if(d[o][y]>d[o][u]+e){
				d[o][y]=d[o][u]+e;
				node ppp;ppp.d=d[o][y];ppp.x=y;
				q.push(ppp);
			}
		}
	}
}
void dfs(int x,double ak,int num){
	if(ak>=ans)return ;
	if(n<num){
		ans=min(ak,ans);
		return ;
	}
	for(int i=1;i<=n;i++){
		bool pd=true;
		double res=ak+lens(x,i);
		if(x==i)continue;
		if(vis[i])continue;
		vis[i]=true;
		for(int j=1;j<=n;j++){
			if(vis[j])continue;
			res+=d[i][j];
			if(res>=ans){
				pd=false;break;
			}
		}if(!pd)continue;
		dfs(i,ak+lens(x,i),num+1);
		vis[i]=false;
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%d%d",&x[i],&y[i]);
	}
	for(int i=0;i<=n;i++)
		for(int j=0;j<i;j++){
			if(i==j)continue;
			add(i,j,lens(i,j));
			add(j,i,lens(i,j));
		}
	for(int i=0;i<=n;i++)dist(i);
	dfs(0,0,1);
	printf("%.2lf",ans);
}
2021/11/10 18:49
加载中...