Tactical Multiple Defense System UVALive

来源:互联网 发布:java课程表管理系统 编辑:程序博客网 时间:2024/06/06 02:07

这个题目是训练赛的一个题目,当时一开始以为是一个几何,仔细读题后,我和队友确定这是一个最大匹配,然后建边,建边的时候一个点确定一个半径,然后判重跑一边匈牙利就行。判重的方法很多,我这个做法有点太暴力~~~直接枚举的。

#include <iostream>#include <vector>#include <cstdio>#include <string>#include <cstring>#include <algorithm>#include <map>using namespace std;const int maxn = 1e5 + 10;vector<int> G[maxn];int from[maxn];int cnt;bool vis[maxn];bool use[maxn];map<double,int> mp;int ans;int n;bool match(int x){    for(int i = 0; i < G[x].size(); i++)    {        if(!vis[G[x][i]])        {            vis[G[x][i]] = true;            if(!from[G[x][i]]|| match(from[G[x][i]]))            {                from[G[x][i]] = x;                return true;            }        }    }    return false;}int hungary(){    cnt = 0;    memset(from,0,sizeof(from));    for(int i = 1000; i <= 6000; i++)    {        if(use[i])        {            memset(vis,0,sizeof(vis));            if(match(i))                ++cnt;        }    }    return cnt;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        memset(use,0,sizeof(use));        int ans = 7000;        scanf("%d",&n);        for(int i = 1000; i <= 6000; i++)            G[i].clear();        mp.clear();        for(int i = 0; i < n; i++)        {            int r,x,y;            scanf("%d %d %d",&r,&x,&y);            double tmp = y *1.0 / x;            int num;            if(!mp.count(tmp))            {                ans++;                num = ans;                mp[tmp] = ans;            }            else            {                num = mp[tmp];            }            G[r].push_back(num);            use[r] = true;        }        int cur =  hungary();        printf("%d\n",cur);    }    return 0;}


原创粉丝点击