【二分匹配】 HDU 2389 Rain on your Parade HK算法
一人一定要一伞
注意建图
原来不是曼哈顿距离。。。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <string> #include <iostream> #include <algorithm> #include <sstream> #include <math.h> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #include <set> #include <map> #define cler(arr, val) memset(arr, val, sizeof(arr)) #define IN freopen ("in.txt" , "r" , stdin); #define OUT freopen ("out.txt" , "w" , stdout); typedef long long LL; const int MAXN = 3001;//点数的最大值 const int MAXM = 20006;//边数的最大值 const int INF = 1101521204; const int mod = 10000007; int Mx[MAXN],My[MAXN],Nx,Ny; vector<int>g[MAXN]; int dx[MAXN],dy[MAXN],dis; bool vst[MAXN]; bool searchP() { queue<int>Q; while(!Q.empty()) Q.pop(); dis=INF; memset(dx,-1,sizeof(dx)); memset(dy,-1,sizeof(dy)); for(int i=0;i<Nx;i++) if(Mx[i]==-1) { Q.push(i); dx[i]=0; } while(!Q.empty()) { int u=Q.front(); Q.pop(); if(dx[u]>dis) break; for(int i=0;i<g[u].size();i++) { int v=g[u][i]; if(dy[v]==-1) { dy[v]=dx[u]+1; if(My[v]==-1) dis=dy[v]; else { dx[My[v]]=dy[v]+1; Q.push(My[v]); } } } } return dis!=INF; } bool DFS(int u) { for(int i=0;i<g[u].size();i++) { int v=g[u][i]; if(!vst[v]&&dy[v]==dx[u]+1) { vst[v]=1; if(My[v]!=-1&&dy[v]==dis) continue; if(My[v]==-1||DFS(My[v])) { My[v]=u; Mx[u]=v; return 1; } } } return 0; } int MaxMatch() { int res=0; memset(Mx,-1,sizeof(Mx)); memset(My,-1,sizeof(My)); while(searchP()) { memset(vst,0,sizeof(vst)); for(int i=0;i<Nx;i++) if(Mx[i]==-1&&DFS(i)) res++; } return res; } double a[3001],b[3001],s[3001]; double dist(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } int main() { int t,n,cas=1,m,time; // IN; scanf("%d",&t); while(t--) { scanf("%d %d",&time,&n); for(int i=0;i<n;i++) g[i].clear(); for(int i=0;i<n;i++) scanf("%lf%lf%lf",&a[i],&b[i],&s[i]); scanf("%d",&m); for(int i=0;i<m;i++) { double x,y; scanf("%lf %lf",&x,&y); for(int j=0;j<n;j++) { double manha=dist(x,y,a[j],b[j]); if(manha<=time*s[j]) g[j].push_back(i); } } Nx=n; printf("Scenario #%d:\n",cas++); printf("%d\n\n",MaxMatch()); } return 0; }