hdu2389 Rain on your Parade (最大匹配Hopcroft--Karp)
2013-09-02 15:07
399 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2389
//邻接矩阵265ms
#include <cstdio> #include <queue> #include <vector> #include <cstring> #include <cmath> #define MAXN 3002 using namespace std; struct node { int x,y; }guests[MAXN],umbrella[MAXN]; int nx,ny,distx[MAXN],disty[MAXN]; int visited[MAXN],mx[MAXN],my[MAXN]; vector<int> graphics[MAXN]; queue<int> Q; int Scan() { int res = 0, ch, flag = 0; if((ch = getchar()) == '-') flag = 1; else if(ch >= '0' && ch <= '9') res = ch - '0'; while((ch = getchar()) >= '0' && ch <= '9' ) res = res * 10 + ch - '0'; return flag ? -res : res; } double Cal_Dist(int i,int j) { double x=1.0*(guests[i].x-umbrella[j].x); double y=1.0*(guests[i].y-umbrella[j].y); return sqrt(x*x+y*y); } int find(int u) {//寻找增广路 int i,temp; for(i=0;i<graphics[u].size();++i)//枚举所有以i为起点的边 { temp=graphics[u][i]; if(!visited[temp]&&(disty[temp]==distx[u]+1)) { visited[temp]=1; if(!my[temp]||find(my[temp])) { mx[u]=temp; my[temp]=u; return 1; } } } return 0; } int search() { int temp,u,flag=0; memset(distx,0,sizeof(distx)); memset(disty,0,sizeof(disty)); while(!Q.empty()) Q.pop(); for(int i=1;i<=nx;++i) { if(!mx[i]) Q.push(i); } while(!Q.empty()) { u=Q.front(); Q.pop(); for(int i=0;i<graphics[u].size();++i) { temp=graphics[u][i]; if(!disty[temp]) { disty[temp]=distx[u]+1; if(my[temp]) { distx[my[temp]]=disty[temp]+1; Q.push(my[temp]); } else flag=1; } } } return flag; } int matching() { int ans=0; memset(mx,0,sizeof(mx)); memset(my,0,sizeof(my)); while(search()) { memset(visited,0,sizeof(visited)); for(int i=1;i<=nx;++i) if(!mx[i]&&find(i)) ans++; } return ans; } int main() { int test,time,i,j,cases=1; int speed[MAXN]; scanf("%d",&test); while(test--) { scanf("%d %d",&time,&nx); for(i=1;i<=nx;++i) { //scanf("%d %d %d",&guests[i].x,&guests[i].y,&speed[i]); guests[i].x=Scan(); guests[i].y=Scan(); speed[i]=Scan(); } //scanf("%d",&ny); ny=Scan(); for(i=1;i<=ny;++i) { //scanf("%d %d",&umbrella[i].x,&umbrella[i].y); umbrella[i].x=Scan(); umbrella[i].y=Scan(); } for(i=1;i<=nx;++i) {//能够在下雨前拿到伞的建一条边 graphics[i].clear(); for(j=1;j<=ny;++j) if(1.0*speed[i]*time>=Cal_Dist(i,j)) graphics[i].push_back(j); } printf("Scenario #%d:\n",cases++); printf("%d\n\n",matching()); } return 0; }
//邻接矩阵265ms
#include <cstdio> #include <queue> #include <vector> #include <cstring> #define MAXN 3002 #define INF 0x3ffffff using namespace std; int guests[MAXN][2],umbrella[MAXN][2]; int nx,ny,dis,distx[MAXN],disty[MAXN]; int visited[MAXN],mx[MAXN],my[MAXN]; int graphics[MAXN][MAXN]; queue<int> Q; int Scan() { int res = 0, ch, flag = 0; if((ch = getchar()) == '-') flag = 1; else if(ch >= '0' && ch <= '9') res = ch - '0'; while((ch = getchar()) >= '0' && ch <= '9' ) res = res * 10 + ch - '0'; return flag ? -res : res; } int search() { int u; dis=INF; memset(distx,-1,sizeof(distx)); memset(disty,-1,sizeof(disty)); while(!Q.empty()) Q.pop(); for(int i=0;i<nx;++i) { if(mx[i]==-1) { Q.push(i); distx[i]=0; } } while(!Q.empty()) { u=Q.front(); Q.pop(); if(distx[u]>dis) break; for(int i=0;i<ny;++i) { if(graphics[u][i]&&disty[i]==-1) { disty[i]=distx[u]+1; if(my[i]==-1) { dis=disty[i]; } else { distx[my[i]]=disty[i]+1; Q.push(my[i]); } } } } return dis!=INF; } int findpath(int u) {//寻找增广路 for(int i=0;i<ny;++i) { if(!visited[i]&&graphics[u][i]&&(disty[i]==distx[u]+1)) { visited[i]=1; if(my[i]!=-1&&disty[i]==dis) continue; if(my[i]==-1||findpath(my[i])) { mx[u]=i; my[i]=u; return 1; } } } return 0; } int matching() { int ans=0; memset(mx,-1,sizeof(mx)); memset(my,-1,sizeof(my)); while(search()) { memset(visited,0,sizeof(visited)); for(int i=0;i<nx;++i) if(mx[i]==-1&&findpath(i)) ans++; } return ans; } int main() { int test,time,i,j,x,y,temp,cases=1; int speed[MAXN]; scanf("%d",&test); while(test--) { scanf("%d %d",&time,&nx); for(i=0;i<nx;++i) { scanf("%d %d %d",&guests[i][0],&guests[i][1],&speed[i]); } scanf("%d",&ny); for(i=0;i<ny;++i) { scanf("%d %d",&umbrella[i][0],&umbrella[i][1]); //umbrella[i][0]=Scan(); //umbrella[i][1]=Scan(); } memset(graphics,0,sizeof(graphics)); for(i=0;i<nx;++i) { for(j=0;j<ny;++j) { temp=speed[i]*speed[i]*time*time; x=(guests[i][0]-umbrella[j][0]); y=(guests[i][1]-umbrella[j][1]); if(temp>=x*x+y*y) graphics[i][j]=1; } } printf("Scenario #%d:\n",cases++); printf("%d\n\n",matching()); } return 0; }
相关文章推荐
- HDU 2389 ——Rain on your Parade——————【Hopcroft-Karp求最大匹配、sqrt(n)*e复杂度】
- hdu 2389 Rain on your Parade(二分图最大匹配,Hopcroft-Karp)
- HDU2389 Rain on your Parade 【二分图最大匹配+HK算法】
- Hdu2389 Rain on your Parade (HK二分图最大匹配)
- Hopcroft-Karp 二分图HDU2389 Rain on your Parade
- hdu2389 Rain on your Parade(二分匹配hopcroft-carp算法)
- hdu 2389 Rain on your Parade(最大匹配,Hopcroft-Karp算法模版)
- hdu2389 Rain on your Parade【二分图最大匹配-HK算法】
- Rain on your Parade---hdu2389(HK求最大匹配)
- hdu2389 Rain on your Parade--HK算法 & 最大匹配数
- hdu 2389 Rain on your Parade(二分匹配Hopcroft-Carp算法模版)
- HDU2389 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)
- [HDOJ2389]Rain on your Parade(二分图最大匹配,HK算法)
- hdu 2389 Rain on your Parade (二分图,Hopcroft-Karp)
- HDU2389-Rain on your Parade(二分图匹配Hopcroft-Karp算法)
- 【HDU】2389 Rain on your Parade 二分匹配 Hopcroft-Krap算法