【POJ】2536 Gopher II 二分匹配
2014-08-03 15:07
465 查看
传送门:【POJ】2536 Gopher II
题目分析:二分匹配模板题
代码如下:
题目分析:二分匹配模板题
代码如下:
#include <cmath> #include <cstdio> #include <cstring> #include <algorithm> using namespace std ; #define REP( i , a , b ) for ( int i = a ; i < b ; ++ i ) #define REV( i , a , b ) for ( int i = a - 1 ; i >= b ; -- i ) #define FOR( i , a , b ) for ( int i = a ; i <= b ; ++ i ) #define FOV( i , a , b ) for ( int i = a ; i >= b ; -- i ) #define CLR( a , x ) memset ( a , x , sizeof a ) const int MAXN = 1000 ; const int MAXQ = 2000 ; const int MAXE = 100005 ; const int INF = 0x3f3f3f3f ; struct Edge { int v , n ; Edge () {} Edge ( int v , int n ) : v ( v ) , n ( n ) {} } ; Edge E[MAXE] ; int H[MAXN] , cntE ; int Q[MAXQ] , head , tail ; int Lx[MAXN] , Ly[MAXN] ; int dx[MAXN] , dy[MAXN] ; bool vis[MAXN] ; int n , m , s , v ; int dis ; double X[MAXN] , Y[MAXN] ; void init () { cntE = 0 ; CLR ( H , -1 ) ; } void addedge ( int u , int v ) { E[cntE] = Edge ( v , H[u] ) ; H[u] = cntE ++ ; } int Hopcroft_Krap () { dis = INF ; CLR ( dx , -1 ) ; CLR ( dy , -1 ) ; head = tail = 0 ; FOR ( i , 1 , n ) if ( Lx[i] == -1 ) { dx[i] = 0 ; Q[tail ++] = i ; } while ( head != tail ) { int u = Q[head ++] ; if ( dx[u] >= dis ) continue ; for ( int i = H[u] ; ~i ; i = E[i].n ) { int v = E[i].v ; if ( dy[v] == -1 ) { dy[v] = dx[u] + 1 ; if ( Ly[v] == -1 ) dis = dy[v] ; else { dx[Ly[v]] = dy[v] + 1 ; Q[tail ++] = Ly[v] ; } } } } return dis != INF ; } int find ( int u ) { for ( int i = H[u] ; ~i ; i = E[i].n ) { int v = E[i].v ; if ( !vis[v] && dy[v] == dx[u] + 1 ) { vis[v] = 1 ; if ( ~Ly[v] && dy[v] == dis ) continue ; if ( Ly[v] == -1 || find ( Ly[v] ) ) { Lx[u] = v ; Ly[v] = u ; return 1 ; } } } return 0 ; } int match () { int ans = 0 ; CLR ( Lx , -1 ) ; CLR ( Ly , -1 ) ; while ( Hopcroft_Krap () ) { CLR ( vis , 0 ) ; FOR ( i , 1 , n ) if ( Lx[i] == -1 ) ans += find ( i ) ; } return ans ; } double dist ( double x , double y ) { return sqrt ( x * x + y * y ) ; } void solve () { double x , y ; init () ; FOR ( i , 1 , n ) scanf ( "%lf%lf" , &X[i] , &Y[i] ) ; FOR ( i , 1 , m ) { scanf ( "%lf%lf" , &x , &y ) ; FOR ( j , 1 , n ) if ( v * s >= dist ( X[j] - x , Y[j] - y ) ) addedge ( j , i ) ; } printf ( "%d\n" , n - match () ) ; } int main () { while ( ~scanf ( "%d%d%d%d" , &n , &m , &s , &v ) ) solve () ; return 0 ; }
相关文章推荐
- POJ 2536 Gopher II 二分匹配
- poj 2536 Gopher II 二分匹配应用 匈牙利算法
- poj 2536 Gopher II 最大二分匹配
- poj 2536 Gopher II (二分匹配)
- poj 2536 Gopher II 最大匹配
- POJ 2536 Gopher II(二分图最大匹配)
- POJ 2536 Gopher II (二分图求最大匹配)
- POJ 2536 Gopher II(二分图最大匹配)
- 【二分图+最大匹配】北大 poj 2536 Gopher II
- POJ 2536 Gopher II(二分图最大匹配)
- poj 2536 Gopher II 二分图最大匹配
- POJ 2536 Gopher II (二分图最大匹配)
- POJ 2536 Gopher II(二分图最大匹配)
- poj 2536 Gopher II(二分图最大匹配,构图)
- POJ 2536 Gopher II(二分图最大匹配)
- POJ 2536 之 Gopher II(二分图最大匹配)
- POJ - 2536 Gopher II 二分图 最大匹配
- POJ 2536 Gopher II(二分图的最大匹配)
- POJ 2536 Gopher II(二分图最大匹配)
- POJ-2536 Gopher II(二分图最大匹配)