Rain on your ParadeTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Others)Total Submission(s): 5383 Accepted Submission(s): 1775 Problem Description You’re giving a party in the garden of your villa by the sea. The party is a huge success, and everyone is here. It’s a warm, sunny evening, and a soothing wind sends fresh, salty air from the sea. The evening is progressing just as you had imagined. It could be the perfect end of a beautiful day.
Input The input starts with a line containing a single integer, the number of test cases.
Output For each test case, write a line containing “Scenario #i:”, where i is the number of the test case starting at 1. Then, write a single line that contains the number of guests that can at most reach an umbrella before it starts to rain. Terminate every test case with a blank line.
Sample Input 2 1 2 1 0 3 3 0 3 2 4 0 6 0 1 2 1 1 2 3 3 2 2 2 2 4 4
Sample Output Scenario #1: 2 Scenario #2: 2
Source
Recommend lcy |
求人对伞的最大匹配数,不过这个数据量比较大,开始试了试vector的匈牙利也是tle了,就上了hk函数一A;
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn = 3005;
vector<int>G[maxn];
int n, m;
struct ***{
int x, y, v;
}peo[4000];
int un;
int mx[maxn], my[maxn];
int dx[maxn], dy[maxn];
bool use[maxn];
int dis;
bool searchp() {
queue<int>Q;
dis = inf;
memset(dx, -1, sizeof(dx));
memset(dy, -1, sizeof(dy));
for (int s = 0; s < un; s++)
if (mx[s] == -1) {
Q.push(s);
dx[s] = 0;
}
while (!Q.empty()) {
int u = Q.front();
Q.pop();
if (dx[u] > dis)break;
int sz = G[u].size();
for (int s = 0; s < sz; s++) {
int v = G[u][s];
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 s = 0; s < sz; s++) {
int v = G[u][s];
if (!use[v] && dy[v] == dx[u] + 1) {
use[v] = 1;
if (my[v] != -1 && dy[v] == dis)continue;
if (my[v] == -1 || dfs(my[v])) {
my[v] = u;
mx[u] = v;
return 1;
}
}
}
return 0;
}
int maxmatch()
{
int ans = 0;
memset(mx, -1, sizeof(mx));
memset(my, -1, sizeof(my));
while (searchp()) {
memset(use, 0, sizeof(use));
for (int s = 0; s < un; s++) {
if(mx[s] == -1 && dfs(s))
ans++;
}
}
return ans;
}
int main()
{
int te, cas = 1;
cin >> te;
while (te--)
{
int time;
scanf("%d%d", &time, &n);
un = n;
for (int s = 0; s <= n; s++) {
G[s].clear();
}
for (int s = 0; s < n; s++)
scanf("%d%d%d", &peo[s].x, &peo[s].y, &peo[s].v);
scanf("%d", &m);
for (int w = 0; w < m; w++) {
int a, b; scanf("%d%d", &a, &b);
for (int s = 0; s < n; s++) {
double len = (1.0*peo[s].x - a)*(1.0*peo[s].x - a) + (1.0*peo[s].y - b)*(1.0*peo[s].y - b);
if (sqrt(len) <= peo[s].v*time) {
G[s].push_back(w);
// cout << s << " kk " << w << endl;
}
}
}
int sum = maxmatch();
printf("Scenario #%d:\n", cas++);
printf("%d\n\n", sum);
}
}