样例没过求助!
查看原帖
样例没过求助!
658786
STUDENT00楼主2022/12/15 20:35

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=65;
const int INF=1e9;
int k,n,x[N],y[N],ans,l[N],cur[N],dis[N][N];
map<string,int> f;
vector<pair<int,int> > g[N];
vector<int> o[N];
bool check(int a,int b){
	if((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])>k*k) return 0;
	for(int i=1;i<=n;i++){
		if(i==a||i==b) continue;
		if((x[i]-x[a])*(y[b]-y[a])==(x[b]-x[a])*(y[i]-y[a])) return 0;
	}
	return 1;
}
void add(int x,int y,int z){
	o[x].push_back(g[y].size());
	o[y].push_back(g[x].size());
	g[x].push_back(make_pair(y,z));
	g[y].push_back(make_pair(x,0));
}
queue<int> q;
bool bfs(){
	memset(l,-1,sizeof(l));
	memset(cur,0,sizeof(cur));
	l[0]=0;q.push(0);
	while(!q.empty()){
		int now=q.front();
		q.pop();
		for(int i=0;i<g[now].size();i++){
			int t=g[now][i].first,s=g[now][i].second;
			if(l[t]==-1&&s){
				l[t]=l[now]+1;
				q.push(t);
			}
		}
	}
	return l[2*n+1]!=-1;
}
int dfs(int now=0,int mins=INF){
	if(now==2*n+1) return mins;
	int sum=mins;
	for(int i=cur[now];i<g[now].size();i++){
		cur[now]=i;
		int t=g[now][i].first,s=g[now][i].second;
		if(l[t]==l[now]+1&&s){
			int p=dfs(t,min(sum,s));
			sum-=p;g[now][i].second-=p;g[t][o[now][i]].second+=p;
		}
	}
	return mins-sum;
}
int main(){
	scanf("%d%d",&k,&n);
	for(int i=1;i<=2*n;i++){
		scanf("%d%d",&x[i],&y[i]);
		string name;cin>>name;
		f[name]=i;
	}
	string name1,name2;
	int p;
	for(int i=1;i<=n;i++) add(0,i,INF);
	for(int i=1;i<=n;i++) add(n+i,2*n+1,INF);
	for(int i=1;i<=n;i++){
		for(int j=n+1;j<=2*n;j++){
			if(check(i,j)) dis[i][j]=1;
		}
	}
	while(cin>>name1&&name1!="End"&&cin>>name2&&scanf("%d",&p)){
		int a=f[name1],b=f[name2];
		if(a>b) swap(a,b);
		if(check(a,b)) dis[a][b]=p;
	}
	for(int i=1;i<=n;i++){
		for(int j=n+1;j<=2*n;j++){
			if(check(i,j)) add(i,j,dis[i][j]);
		}
	}
	while(bfs()) ans+=dfs();
	printf("%d",ans);
	return 0;
}

@gesong

2022/12/15 20:35
加载中...