地图上一些人,一些伞,每个人都有一个速度,问最多能有多少人能在下雨之前躲到伞里面。雨将会在t分钟后来临。
#include<iostream> #include<math.h> #include<stdio.h> #include<algorithm> #include<string.h> #include<vector> #include<queue> #include<map> #include<set> #define B(x) (1<<(x)) using namespace std; typedef long long ll; void cmax(int& a,int b){ if(b>a)a=b; } void cmin(int& a,int b){ if(b<a)a=b; } void cmax(ll& a,ll b){ if(b>a)a=b; } void cmin(ll& a,ll b){ if(b<a)a=b; } void add(int& a,int b,int mod){ a=(a+b)%mod; } void add(ll& a,ll b,ll mod){ a=(a+b)%mod; } const int oo=0x3f3f3f3f; const int MOD=1000000007; const int maxn=6666; const int maxm=44435556; int vis[maxn]; int x[maxn],y[maxn]; int dx[maxn],dy[maxn]; int dis,n; struct EDGE{ int v,next; }E[maxm]; int head[maxn],tol; struct Node{ int x,y,sp; }a[maxn],b[maxn]; void Init(){ memset(head,-1,sizeof head); tol=0; } void add_edge(int u,int v){ E[tol].v=v; E[tol].next=head[u]; head[u]=tol++; } bool bfs(){ memset(dx,-1,sizeof dx); memset(dy,-1,sizeof dy); dis=oo; queue<int>q; for(int i=1;i<=n;i++){ if(x[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=head[u];i!=-1;i=E[i].next){ int v=E[i].v; if(dy[v]==-1){ dy[v]=dx[u]+1; if(y[v]==-1)dis=dy[v]; else{ dx[y[v]]=dy[v]+1; q.push(y[v]); } } } } return dis!=oo; } int dfs(int u){ for(int i=head[u];i!=-1;i=E[i].next){ int v=E[i].v; if(!vis[v]&&dy[v]==dx[u]+1){ vis[v]=1; if(y[v]!=-1&&dy[v]==dis)continue; if(y[v]==-1||dfs(y[v])){ x[u]=v; y[v]=u; return 1; } } } return 0; } int Match(){ memset(x,-1,sizeof x); memset(y,-1,sizeof y); int ans=0; while(bfs()){ memset(vis,0,sizeof vis); for(int i=1;i<=n;i++)if(x[i]==-1){ ans+=dfs(i); } } return ans; } int main(){ //freopen("E:\\read.txt","r",stdin); int u,v,t,N,M,T; scanf("%d",&T); for(int cas=1;cas<=T;cas++){ Init(); scanf("%d",&t); scanf("%d",&N); for(int i=1;i<=N;i++){ scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].sp); } scanf("%d",&M); for(int i=1;i<=M;i++){ scanf("%d %d",&b[i].x,&b[i].y); } n=N+M; for(int i=1;i<=N;i++){ for(int j=1;j<=M;j++){ if(abs(a[i].x-b[j].x)+abs(a[i].y-b[j].y)<=a[i].sp*t) add_edge(i,j+N); } } printf("Scenario #%d:\n%d\n\n",cas,Match()); } return 0; }