hdu 2389 Rain on your Parade (二分图,Hopcroft-Karp)
2015-04-06 12:30
369 查看
地图上一些人,一些伞,每个人都有一个速度,问最多能有多少人能在下雨之前躲到伞里面。雨将会在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; }
相关文章推荐
- hdu 2389 Rain on your Parade(二分图最大匹配,Hopcroft-Karp)
- HDU 2389 ——Rain on your Parade——————【Hopcroft-Karp求最大匹配、sqrt(n)*e复杂度】
- HDU-2389 Rain on your Parade(二分图之Hopcroft-Karp算法)
- HDU 2389 Rain on your Parade / HUST 1164 4 Rain on your Parade(二分图的最大匹配)
- Rain on your Parade HDU - 2389 Hopcroft_Carp模板
- hdu 2389 Rain on your Parade(最大匹配,Hopcroft-Karp算法模版)
- HDU 2389 Rain on your Parade(Hopcroft-Carp算法板子题)
- HDU2389 Rain on your Parade 二分匹配 Hopcroft-Carp的算法+模版
- HDU 2389 Rain on your Parade(二分匹配+Hopcroft-Carp算法模板题)
- HDU 2389 Rain on your Parade (HK二分图)
- HDU-2389-Rain on your Parade [二分匹配][Hopcroft-Carp]
- HDU 2389 Rain on your Parade(二分匹配,Hopcroft-Carp算法)
- Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)
- 【HDU】2389 Rain on your Parade 二分匹配 Hopcroft-Krap算法
- HDU 2389 Rain on your Parade(Hopcroft_Carp Algorithm)
- HDU 2389 Rain on your Parade(Hopcroft-Carp算法模板)
- Hopcroft-Karp 二分图HDU2389 Rain on your Parade
- hdu 2389 Rain on your Parade(二分匹配Hopcroft-Carp算法模版)
- F - Rain on your Parade - hdu 2389(二分图匹配,Hk算法)
- HDU-2389 Rain on your Parade 裸Hopcroft–Karp algorithm