HDU 2413 POJ 3343 Against Mammoths(二分图匹配)

题意:星球大战 ,地球人有n个星球,外星人有m个星球,每一个星球都初始的飞机数,和生产飞机的能力。问地球人要多长时间才能打败外星人。。

1,一个地球人的星球只能打一个外星人的星球,一个外星人的星球只能被一个地球人的星球攻击,因此可以用二分图匹配。(开始时没有看清这句,以为是线性规划的问题,老感觉不对劲,看了别人用二分图匹配之后,,,,)

2,二分时间。时间的最大值,我也不会算,(大哭) 用INF=0x3f3f3f3f;能过就是了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>

using namespace std;
const int N = 259;
const int INF = 0x3f3f3f3f;
int hst[N],hsp[N],ast[N],asp[N];
int dis[N][N];
int n,m;
void init()
{
    for(int i=0;i<n;i++)
    scanf("%d%d",&hst[i],&hsp[i]);
    for(int i=0;i<m;i++)
    scanf("%d%d",&ast[i],&asp[i]);
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
    scanf("%d",&dis[i][j]);
}
bool map[N][N];
int Lin[N];
int visit[N];
bool fin(int x)
{
    for(int i=0;i<m;i++)
    if(map[x][i]&&(!visit[i]))
    {
        visit[i] = true;
        if(Lin[i]==-1||fin(Lin[i]))
        {
            Lin[i] = x;
            return true;
        }
    }
    return false;
}
bool ok(int t)
{
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
    if(1ll+hst[i]+1ll*(t-dis[i][j])*hsp[i]>=1ll+ast[j]+1ll*t*asp[j])
        map[i][j] = true;
    else
        map[i][j] = false;
    int ans = 0;
    memset(Lin,-1,sizeof(Lin));
    for(int i=0;i<n;i++)
    {
        memset(visit,false,sizeof(visit));
        if(fin(i))
        ans++;
    }
    if(ans==m) return true;
    return  false;
}
int oor(int l,int r)
{
    if(l==r) return l;
    int mid = (l+r)>>1;
    if(ok(mid))
    return oor(l,mid);
    else
    return oor(mid+1,r);
}
void solve()
{
    if(!ok(INF))
    {
        printf("IMPOSSIBLE\n");
        return ;
    }
    printf("%d\n",oor(0,INF));
}
int main()
{
    freopen("in.txt","r",stdin);
    while(~scanf("%d%d",&n,&m)&&(n+m))
    {
        init();
        solve();
    }
    return 0;
}


你可能感兴趣的:(HDU 2413 POJ 3343 Against Mammoths(二分图匹配))