由于在每个顶点只能走出去寻找一个好玩的地方,可以将顶点与每个符合条件的好玩的地方匹配,求最大匹配即可 一开始由于没看到限制条件一个,没想到用匹配做 代码: #include<iostream> #include<cmath> using namespace std; #define MAX 105 int master[MAX][2],dog[MAX][2],u[MAX],link[MAX]; int g[MAX][MAX],res[MAX]; int n,m; double getLen(int x1,int y1,int x2,int y2) { double x=(double)(x1-x2),y=(double)(y1-y2); return sqrt(x*x+y*y); } int dfs(int t) { for(int i=1;i<=m;i++) { if(!u[i]&&g[t][i]) { u[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=t; res[t]=i; return 1; } } } return 0; } int hungary() { int i,num=0; memset(link,-1,sizeof(link)); memset(res,-1,sizeof(res)); for(i=1;i<=n;i++) { memset(u,0,sizeof(u)); num+=dfs(i); } return num; } int main() { int i,j; double len1,len2,len; scanf("%d %d",&n,&m); for(i=1;i<=n;i++) { scanf("%d %d",&master[i][0],&master[i][1]); } for(j=1;j<=m;j++) { scanf("%d %d",&dog[j][0],&dog[j][1]); } for(i=1;i<n;i++) { for(j=1;j<=m;j++) { len1=getLen(master[i][0],master[i][1],dog[j][0],dog[j][1]); len2=getLen(master[i+1][0],master[i+1][1],dog[j][0],dog[j][1]); len=getLen(master[i][0],master[i][1],master[i+1][0],master[i+1][1]); //cout<<len1<<" "<<len2<<" "<<len*2<<endl; if(len1+len2<=2*len) g[i][j]=1; } } printf("%d/n",n+hungary()); for(i=1;i<=n;i++) { printf("%d %d ",master[i][0],master[i][1]); if(res[i]!=-1) { printf("%d %d ",dog[res[i]][0],dog[res[i]][1]); } } printf("/n"); return 0; }