70分求助啊怀疑是预处理的时候有bug但找不出来
查看原帖
70分求助啊怀疑是预处理的时候有bug但找不出来
179725
最强星星楼主2020/5/3 17:41
#include<bits/stdc++.h>
#define delta_x ((double)(where[i][1]-where[j][1]))
#define delta_y ((double)(where[i][2]-where[j][2]))
#define maxn 1051
using namespace std;
map<string,int>pp;
int n,kk;
int delta;
int w[maxn][maxn<<1]; 
int f[maxn<<1]; 
int to[maxn];
int where[maxn][3];
struct check{
	double k;double dis;
}meet[maxn][maxn];
bool used[maxn<<1];
bool doit(int p){
	used[p]=1;
	for(int i=n+1;i<=n+n;i++)
	if(!used[i]){
		if(f[p]+f[i]==w[p][i]){
			used[i]=1;
			if(!to[i]||doit(to[i])){
				to[i]=p;
				return 1;
			}
		}
		else delta=min(delta,f[p]+f[i]-w[p][i]);
	}
	return 0;
}
string Lower(char* temp){
	for(int i=0;i<strlen(temp);i++)
	if(temp[i]>='A'&&temp[i]<='Z')temp[i]-='A'-'a';
	return temp;
}
void init(){
	char temp[21];
	char ttemp[21];
	scanf("%d%d",&kk,&n);
	for(int i=1;i<=n+n;i++){
		scanf("%d%d%s",&where[i][1],&where[i][2],temp);
		pp[Lower(temp)]=i;
	}
	while(1){
		scanf("%s",temp);
		if(temp[0]=='E'&&temp[1]=='n'&&temp[2]=='d'&&!temp[3])
		break;
		scanf("%s",ttemp);scanf("%d",&w[min(pp[Lower(temp)],pp[Lower(ttemp)])][max(pp[Lower(temp)],pp[Lower(ttemp)])]);
	}
	for(int i=1;i<=n;i++)
	for(int j=n+1;j<=n+n;j++)
	if(!w[i][j])w[i][j]=1;
}
void pre(){
	for(int i=1;i<=n;i++)
	for(int j=n+1;j<=n+n;j++){
		meet[i][j].k=(delta_y+0.5)/(delta_x+0.5);
		meet[i][j].dis=sqrt(delta_x*delta_x+delta_y*delta_y);
		if(meet[i][j].dis>(double)kk)w[i][j]=0; 
		if(delta_x<0)meet[i][j].dis*=-1;
//		printf("%d %d %lf %lf\n",i,j,meet[i][j].k,meet[i][j].dis);
	}
	for(int i=1;i<=n;i++)
	for(int j=n+1;j<=n+n;j++)
	for(int k=j+1;k<=n+n;k++)
	if(meet[i][j].k==meet[i][k].k&&meet[i][j].dis/meet[i][k].dis>0){
		if(abs(meet[i][j].k)>abs(meet[i][k].k))w[i][j]=0;
		else w[i][k]=0;
	}
}
main(){
	init();
	pre();
//	for(int i=1;i<=n;i++){
//		for(int j=n+1;j<=n+n;j++)
//		printf("%d ",w[i][j]);
//		printf("\n");
//	}
	int ans=0;
	for(int i=1;i<=n;i++)
	for(int j=n+1;j<=n+n;j++)
	f[i]=max(f[i],w[i][j]);
	for(int i=1;i<=n;i++){
		while(1){
			memset(used,0,sizeof(used));
			delta=INT_MAX;
			if(doit(i))break;
//			printf("%d\n",delta);
			for(int j=1;j<=n;j++)
			if(used[j])f[j]-=delta;
			for(int j=n+1;j<=n+n;j++)
			if(used[j])f[j]+=delta;
		}
	}
	for(int i=1;i<=n+n;i++)
	ans+=f[i];
	printf("%d",ans);
}
2020/5/3 17:41
加载中...