HDU 2389 Rain on your Parade(HK算法)
2017-01-06 13:35
411 查看
看这数据量,显然匈牙利算法要超时,就拿了HK的板子上了。
#include<iostream> #include<cstring> #include<queue> #include<cmath> using namespace std; const int maxn=3000+5; struct guest{int x,y,s;}guests[maxn]; struct umbrella{int x,y;}umbrellas[maxn]; int t,m,n; const int inf=(1<<30); bool line[maxn][maxn]; int cx[maxn],cy[maxn]; int nx,ny; int dx[maxn],dy[maxn]; int dis; bool used[maxn]; bool searchP() { queue<int> q; dis=inf; memset(dx,-1,sizeof(dx)); memset(dy,-1,sizeof(dy)); for(int i=1;i<=nx;i++){ if(cx[i]==-1) {q.push(i);dx[i]=0;}//对于未遍历的点入队 } //准备分层 while(!q.empty()) { int u=q.front(); q.pop(); if(dx[u]>dis) break;//如果目前的层次大于最小增广长度,那么退出 for(int j=1;j<=ny;j++)//对于一切可能的点遍历 { if(line[u][j]==true&&dy[j]==-1){//只对未分层的点遍历 dy[j]=dx[u]+1; if(cy[j]==-1) dis=dy[j]; else{ dx[cy[j]]=dy[j]+1; q.push(cy[j]); } } } } return dis!=inf; } //寻找路径配对 bool findpath(int x) { for(int j=1;j<=ny;j++) { if(!used[j]&&line[x][j]&&dy[j]==dx[x]+1)//符合继续搜索的条件有三个:未访问过,图上联通和层次符合 { used[j]=1; if(cy[j]!=-1&&dis==dy[j]) continue;//如果下一个点还是匹配点且目前已经到达增广最小层次,不需要扩展了 if(cy[j]==-1||findpath(cy[j])) { cy[j]=x;cx[x]=j; return true; } } } return false; } int HK() { int ans=0; memset(cx,-1,sizeof(cx)); memset(cy,-1,sizeof(cy)); while(searchP()) { memset(used,0,sizeof(used)); for(int i=1;i<=nx;i++){ if(cx[i]==-1) { if(findpath(i)) ans++; } } } return ans; } double get_t(guest g,umbrella u) { int xx=g.x-u.x; int yy=g.y-u.y; double dis=sqrt(xx*xx+yy*yy); return dis/g.s; } int main() { int T; scanf("%d",&T); for(int i=1;i<=T;i++) { memset(line,false,sizeof(line)); scanf("%d",&t); scanf("%d",&m); for(int i=1;i<=m;i++) {scanf("%d%d%d",&guests[i].x,&guests[i].y,&guests[i].s);} scanf("%d",&n); for(int i=1;i<=n;i++) {scanf("%d%d",&umbrellas[i].x,&umbrellas[i].y);} for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(get_t(guests[i],umbrellas[j])<=t) line[i][j]=true; } } nx=m;ny=n; printf("Scenario #%d:\n%d\n\n",i,HK()); } return 0; }
相关文章推荐
- hdu 2389 Rain on your Parade(二分最大匹配HK算法)
- hdu 2389 Rain on your Parade 二分匹配 HK算法
- F - Rain on your Parade - hdu 2389(二分图匹配,Hk算法)
- hdu 2389 Rain on your Parade 二分图匹配+HK算法
- hdu 2389 Rain on your Parade (二分匹配 Hc 算法)
- HDU 2389 Rain on your Parade
- HDU 2389 Rain on your Parade //MAXMATCH
- HDU 2389 Rain on your Parade(H-C算法,二分图匹配)
- HDU2389-Rain on your Parade-二分图匹配-ISAP
- HDU-2389 Rain on your Parade 裸Hopcroft–Karp algorithm
- hdu 2389 Rain on your Parade
- HDU-2389 Rain on your Parade
- [HDOJ2389]Rain on your Parade(二分图最大匹配,HK算法)
- HDU 2389 Rain on your Parade (二分匹配)
- hdu 2389 Rain on your Parade (HK)
- hdu 2389 Rain on your Parade(最大匹配,Hopcroft-Karp算法模版)
- HDU 2389 Rain on your Parade
- Hdu 2389 Rain on your Parade
- hdu 2389 Rain on your Parade
- hdu 2389 Rain on your Parade【最大匹配】