90pts 求调 玄关
查看原帖
90pts 求调 玄关
649246
nothing__楼主2023/12/30 14:44
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
const int inf=1e9;
const int N=110, M=1e4+10;
string ss; map<string, int> mp;
int n, k, s, t, ans, dep[N], pre[N]; 
struct node{int x, y;} p[N]; int v[N][N]; bool st[N];
struct edge{int x, y, c, f, pre;} a[M]; int alen, last[N], le[M];
void ins(int x, int y, int c) {
	a[++alen]={x, y, 1, c, last[x]}; last[x]=alen;
	a[++alen]={y, x, 0, -c, last[y]}; last[y]=alen;
}
void change() {for(int i=0;i<ss.length();i++) if(ss[i]>='A'&&ss[i]<='Z') ss[i]+=32;}
double dist(int x, int y, int xx, int yy) {return sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy));}
bool check(int x, int y) {
	double xy=dist(p[x].x, p[x].y, p[y].x, p[y].y);
	if(xy>k) return false;
	for(int i=1;i<=2*n;i++) {
		if(i==x||i==y) continue;
		double xx=dist(p[x].x, p[x].y, p[i].x, p[i].y);
		double yy=dist(p[i].x, p[i].y, p[y].x, p[y].y);
		if(xx+yy-xy<eps) return false;
	}
	return true;
} 
bool bfs() {
	memset(st, 0, sizeof(st));
	for(int i=0;i<=2*n+1;i++) dep[i]=-inf;
	queue<int> q; q.push(s);
	dep[s]=0; st[s]=1;
	while(!q.empty()) {
		int x=q.front(); q.pop(); st[x]=0;
		for(int k=last[x];k;k=a[k].pre) {
			int y=a[k].y;
			if(a[k].c&&dep[y]<dep[x]+a[k].f) {
				dep[y]=dep[x]+a[k].f;
				pre[y]=x; le[y]=k;
				if(!st[y]) {st[y]=true; q.push(y);}
			}
		}
	} 
	if(dep[t]==-inf) return 0;
	for(int i=t;i!=s;i=pre[i]) a[le[i]].c--, a[le[i]^1].c++;
	ans+=dep[t];
	return true;
}
int main() {
	alen=1; memset(last, 0, sizeof(last));
	scanf("%d%d", &k, &n);
	s=0, t=2*n+1;
	for(int i=1;i<=n;i++) ins(s, i, 0), ins(i+n, t, 0);
	memset(v, 0, sizeof(v));	
	for(int i=1;i<=n;i++) {
		int x, y; scanf("%d%d", &x, &y);
		cin >> ss; change();
		mp[ss]=i; p[i]={x, y};
	}
	for(int i=n+1;i<=n*2;i++) {
		int x, y; scanf("%d%d", &x, &y);
		cin >> ss; change();
		mp[ss]=i; p[i]={x, y};
	}
	while(1) {
		cin >> ss; change();
		if(ss[0]=='e'&&ss[1]=='n'&&ss[2]=='d') break;
		int x=mp[ss]; cin >> ss; change();
		int y=mp[ss], c; scanf("%d", &c);
		v[x][y]=v[y][x]=c;
	}
	for(int i=1;i<=n;i++) 
		for(int j=n+1;j<=2*n;j++) 
			if(check(i, j)) 
				ins(i, j, v[i][j]==0?1:v[i][j]);
	ans=0;
	while(bfs()) ;
	printf("%d\n", ans);
	return 0;
}
2023/12/30 14:44
加载中...