bzoj 2044三维导弹拦截 二分图匹配

本文针对三维导弹拦截问题提出了解决方案。首先通过动态规划求解最大不相交导弹数,其次利用匈牙利算法确定最少拦截系统数量。文章提供了一个完整的C++实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:导弹拦截三维版,第一问求最多多少个,第二问求多少个系统能全部打掉。n<=1e3。
一看第一问以为自己穿越了,怎么tg就要cdq啊,一看n=1000= =随便做啊。
第二问最小路径覆盖随便搞,最小路径覆盖=最长反链,跟CTSC2008那题一样。
1A

#include <cstdio>  
#include <iostream>  
#include <algorithm>  
#define N 1005  
#define M 500505  
using namespace std;  
struct bom{int x,y,z;}s[N];  
int b[N],lar,tot,nxt[M],point[M],v[M],belong[N],vis[N];  
void addline(int x,int y){++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;}  
bool operator <(bom j,bom i){return (j.x<i.x&&j.y<i.y&&j.z<i.z);}  
bool find(int x,int k)  
{  
    for (int i=point[x];i;i=nxt[i])  
      if(vis[v[i]]!=k)  
      {  
        vis[v[i]]=k;  
        if (!belong[v[i]] || find(belong[v[i]],k)){belong[v[i]]=x;return true;}  
      }  
    return false;  
}  
int cmp(bom a,bom b){if (a.x==b.x) if (a.y==b.y) return a.z<b.z;else return a.y<b.y;else return a.x<b.x;}  
int main()  
{  
    freopen("missile.in","r",stdin);
    freopen("missile.out","w",stdout);
    int n,i,j;  
    scanf("%d",&n);  
    for (i=1;i<=n;i++) scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].z);  
    sort(s+1,s+n+1,cmp);  
    for (i=1;i<=n;i++)  
    {  
        int maxx=0,mb;  
        for (j=1;j<=n;j++)  
          if (b[j]>maxx && s[j]<s[i])  
          {  
            maxx=b[j];  
            mb=j;  
          }  
        b[i]=maxx+1;  
        lar=max(lar,b[i]);  
    }  
    for (i=1;i<=n;i++)  
      for (j=1;j<=n;j++)  
        if (i!=j && s[i]<s[j])   
          addline(i,j);  
    printf("%d\n",lar);  
    int maxx=0;  
    for (i=1;i<=n;i++)  
      if (find(i,i)) maxx++;  
    printf("%d",n-maxx);  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值