标签:
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Others)
Total Submission(s): 3310 Accepted Submission(s): 1066
/* ID: LinKArftc PROG: 2389.cpp LANG: C++ */ #include <map> #include <set> #include <cmath> #include <stack> #include <queue> #include <vector> #include <cstdio> #include <string> #include <utility> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define eps 1e-8 #define randin srand((unsigned int)time(NULL)) #define input freopen("input.txt","r",stdin) #define debug(s) cout << "s = " << s << endl; #define outstars cout << "*************" << endl; const double PI = acos(-1.0); const double e = exp(1.0); const int inf = 0x3f3f3f3f; const int INF = 0x7fffffff; typedef long long ll; const int maxn = 3010; struct Node { double x, y, speed; Node() {} Node(double _x, double _y) : x(_x), y(_y) {} Node(double _x, double _y, double _s) : x(_x), y(_y), speed(_s) {} } men[maxn], un[maxn]; vector<int>G[maxn]; int uN, vN; int Mx[maxn],My[maxn]; 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 <= uN; i++) if(Mx[i] == -1) { Q.push(i); dx[i] = 0; } while(!Q.empty()) { int u = Q.front(); Q.pop(); if(dx[u] > dis)break; int sz = G[u].size(); for(int i = 0;i < sz;i++) { int v = G[u][i]; if(dy[v] == -1) { dy[v] = dx[u] + 1; if(My[v] == -1)dis = dy[v]; else { dx[My[v]] = dy[v] + 1; Q.push(My[v]); } } } } return dis != INF; } bool DFS(int u) { int sz = G[u].size(); for(int i = 0;i < sz;i++) { int v = G[u][i]; if(!used[v] && dy[v] == dx[u] + 1) { used[v] = true; if(My[v] != -1 && dy[v] == dis)continue; if(My[v] == -1 || DFS(My[v])) { My[v] = u; Mx[u] = v; return true; } } } return false; } int MaxMatch() { int res = 0; memset(Mx,-1,sizeof(Mx)); memset(My,-1,sizeof(My)); while(SearchP()) { memset(used,false,sizeof(used)); for(int i = 1;i <= uN;i++) if(Mx[i] == -1 && DFS(i)) res++; } return res; } int main() { //input; int T, t, _t = 1; scanf("%d", &T); while (T --) { scanf("%d", &t); scanf("%d", &uN); for (int i = 1; i <= uN; i ++) scanf("%lf %lf %lf", &men[i].x, &men[i].y, &men[i].speed); scanf("%d", &vN); for (int i = 1; i <= vN; i ++) scanf("%lf %lf", &un[i].x, &un[i].y); for (int i = 1; i <= uN; i ++) { G[i].clear(); for (int j = 1; j <= vN; j ++) { if (sqrt(fabs(men[i].x - un[j].x) * fabs(men[i].x - un[j].x) + fabs(men[i].y - un[j].y) * fabs(men[i].y - un[j].y)) - men[i].speed * t < eps) G[i].push_back(j); } } printf("Scenario #%d:\n%d\n\n", _t ++, MaxMatch()); } return 0; }
标签:
原文地址:http://www.cnblogs.com/LinKArftc/p/4912145.html