• luogu P2765 魔术球问题 网络流24 最小路径问题


    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #define N 500000
    using namespace std;
    int n,m,S,T,tmp1,tmp2,tot;
    int idx,head[N],cur[N],q[N],ans1[N],ans2[N];
    int e[N],ne[N],w[N];
    bool b[N];
    int r[N],c[N];
    int ans;
    bool vis[N];
    int to[N];
    inline void add(int u,int v,int f)
    {
        e[idx]=v;
        w[idx]=f;
        ne[idx]=head[u];
        head[u]=idx++;
    }
    inline bool bfs()
    {
        int f=0,t=0;
        memset(cur,-1,sizeof(cur));
        q[t++]=0;
        cur[0]=0;
        while(f<t)
        {
            int now=q[f++];
            for(int i=head[now]; ~i; i=ne[i])
            {
                int v=e[i];
                if(cur[v]==-1&&w[i])
                {
                    cur[v]=cur[now]+1;
                    q[t++]=v;
                }
            }
        }
        if(cur[T]!=-1)
            return 1;
        return 0;
    }
    inline int dfs(int x,int f)
    {
        if(x==T)
            return f;
        int w1,used=0;
        for(int i=head[x]; ~i; i=ne[i])
        {
            int v=e[i];
            if(cur[v]==cur[x]+1&&w[i])
            {
                w1=dfs(v,min(f-used,w[i]));
                w[i]-=w1;
                w[i^1]+=w1;
                used+=w1;
                if(used==f)
                    return f;
            }
        }
        if(!used)
            cur[x]=-1;
        return used;
    }
    void dinic()
    {
        while(bfs())
            ans-=dfs(0,0x3f3f3f3f);
    }
    int main()
    {
        memset(head,-1,sizeof head);
        cin>>n;
        S=0,T=10000;
        while(1)
        {
            ans++;
            S++;
            for(int i=1; i<S; i++)
                if(sqrt(i+S)==(int)(sqrt(i+S)))
                    add(i,S+5000,1),add(S+5000,i,0);//拆点
            add(0,S,1);
            add(S,0,0);
            add(S+5000,T,1);
            add(S+5000,T,0);
            dinic();
            if(ans>n)
                break;
        }
        cout<<S-1<<endl;
        for(int i=1; i<S; i++)
            if(!vis[i])
            {
                int now=i;
                do
                {
                    vis[now]=1;
                    cout<<now<<" ";
                    for(int j=head[now]; j!=-1; j=ne[j])
                    {
                        int v=e[j];
                        if(v<=n)
                            continue;
                        if(!w[j])
                        {
                            now=v-5000;
                            break;
                        }
                    }
                }while(!vis[now]);
                cout<<endl;
            }
        return 0;
    }
  • 相关阅读:
    简直不敢相信...
    halcon 保存Region [原创]
    VS2015 下载链接
    C#【数据转换】十进制yte[]相互转换
    C# 复制窗体问题完美解决办法
    TextBox 保持固定长度,添加新行滚动到最后,跨线程。
    mysql isnull
    C#跨线程访问控件[我的记录]
    C# 常用类-IO-ClassExcelExport
    C# 常用类-IO-ClassXML
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/13169365.html
Copyright © 2020-2023  润新知