首页 > 其他分享 >魔术球问题

魔术球问题

时间:2023-01-05 21:44:20浏览次数:52  
标签:dep int sum tot 问题 魔术 ans now

P2765 魔术球问题

关键

1.问题的转换
2.路径的记录
3.枚举的区间

代码

#include <bits/stdc++.h>
using namespace std;
const int N=10005,M=1e6+5;
const int inf=1e9;
 
int h[N],ne[M],e[M],w[M],tot=1;
void add(int from,int to,int wi) {
    e[++tot]=to;  w[tot]=wi;  ne[tot]=h[from];  h[from]=tot;
    e[++tot]=from;w[tot]=0;  ne[tot]=h[to];    h[to]=tot;
}
 
int S=N-2,T=N-1;
int cur[N],dep[N];
bool bfs() {
    memcpy(cur,h,sizeof(h));
    memset(dep,0,sizeof(dep));
    queue<int>q;
    q.push(S);
    dep[S]=1;
    while(!q.empty()) {
        int now=q.front();
        q.pop();
        for(int i=h[now];i;i=ne[i]) {
            int to=e[i];
            if(dep[to]==0&&w[i]>0)
                dep[to]=dep[now]+1,q.push(to);
        }
    }
    return dep[T];
}

int a[M],b[M];
int dfs(int now,int sum) {
    if(now==T)return sum;
    int ans=0;
    for(int i=cur[now];i&&sum;i=ne[i]) {
        cur[now]=i;
        int to=e[i];
        if(dep[to]==dep[now]+1&&w[i]>0) {
            int k=dfs(to,min(sum,w[i]));
            if(k==0)dep[to]=0;
            else b[now>>1]=to>>1; 
            w[i]-=k;
            w[i^1]+=k;
            sum-=k;
            ans+=k;
        }
    }
    return ans;
}
 
int dinic() {
    int ans=0;
    while(bfs())ans+=dfs(S,inf);
    return ans;
}

int main() {
    int cnt=0,num=0;
    int n;cin>>n;
    while(cnt<=n) {
        num++;
        add(S,num<<1,1);
        add(num<<1|1,T,1);
        for(int i=sqrt(num)+1;i*i<2*num;i++)
            add((i*i-num)<<1,num<<1|1,1);
        int k=dinic();
        if(k==0)a[++cnt]=num;//记录的第一个
    }
    cout<<num-1<<endl;
    for(int i=1;i<=n;i++) {
        while(a[i]&&a[i]<num)cout<<a[i]<<' ',a[i]=b[a[i]];
        cout<<endl;
    }
    return 0;
}

标签:dep,int,sum,tot,问题,魔术,ans,now
From: https://www.cnblogs.com/basicecho/p/17028918.html

相关文章

  • P2754 [CTSC1999]家园 / 星际转移问题
    P2754[CTSC1999]家园/星际转移问题关键一个是需要建立分层图,但是分层图如何建立?使用一个while循环,对每次的人数跑一次就可以了挺奇妙的代码#include<bits/stdc++......
  • ros2的cv_bridge库opencv版本不匹配问题
    ros2的cv_bridge库opencv版本不匹配问题问题:libopencv_imgcodecs.so.4.2:cannotopensharedobjectfile:nosuchfileordirectory原因ros安装的时候默认的......
  • git pull和push的时候ssl有问题
    网上搜到了2篇解决问题的blog,先收藏先https://www.jianshu.com/p/628342f01768https://tangly1024.com/article/git-ssl-error......
  • C语言指针常见问题
    我们在学C语言时,指针是我们最头疼的问题之一,针对C语言指针,博主根据自己的实际学到的知识以及开发经验,总结了以下使用C语言指针时常见问题。指针指针做函数参数学习......
  • Unity 模型合并时纹理有缝隙的问题
    解决方式一:加载模型时,将纹理贴图的WrapMode设置为Clamp,FilterMode设置为Point解决方案二:模型合并时将UV往里缩几个像素,产生缝隙的原因是,纹理贴图做了线性插值这是Filter......
  • 解决ensp中usg每次启动都需要更改密码的问题
    想办法创建一个后缀为.cfg的文件,内容如下aaamanager-useradminpasswordcipherxxxxxxxx//这里为登录的密码;需要注意的是要符合usg的密码规则,不然会失败,即要含有大小写s......
  • 网关常见问题
    网关常见问题 侯门一入深似海,从此萧郎是路人 1、什么是网关总而言之,网关就是统一入口、鉴权校验、动态路由和过滤封装。2、为什么需要网关微服务架......
  • 解决阶乘过大超出变量范围的问题
    计算阶乘计算到一定程度往往会超出范围对于unsignedint,四个字节,有32位,最大的数是2^32= 4,294,967,296;然而13!= 6,227,020,800;显然超出范围;对于8个字节......
  • WPF-‘_’在Lable中显示为文字的下划线不独立显示的问题。
    一、原因:  ‘_’在WPF中用于表示访问键。二、对策:  建立新样式,并关闭lable对快捷键的自动处理:RecognizesAccessKey="True"=》"False",如下:<!--不对下划......
  • Starling常见问题解决办法
    ​​Starling常见问题解决办法​​来自:​​智慧+毅力=无所不能​​ 1、Android设备上阻止用户按下后退后的行为侦听按键事件//阻止后退行为view.stage.addEventL......