社区讨论

当前弧可能会负优化??

P1791[国家集训队] 人员雇佣参与者 7已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@mi7pu5gp
此快照首次捕获于
2025/11/21 01:39
4 个月前
此快照最后确认于
2025/11/21 01:54
4 个月前
查看原帖
dinic算法加当前弧优化T了4个点
代码
CPP
#include<bits/stdc++.h>
using namespace std;
#define MAX 2000000
#define MAXN 1002
#define INF LLONG_MAX
#define min(a,b) a>b?b:a
#define add(x,y,z)	addedges(x,y,z),addedges(y,x,0)
int n,now=1,v[MAX],cr[MAXN],nex[MAX],deep[MAXN],head[MAXN];
long long ans,tot,w[MAX];
inline long long read()
{
    register long long x=0;
    register int ch=getchar();
    while(ch<48||ch>57)	ch=getchar();
    while(ch>47&&ch<58)
    {
        x=x*10+(ch^48);
        ch=getchar();
    }
    return x;
}
#define N n+1
queue<int>que;
inline void addedges(int x,int y,int z)
{
    nex[++now]=head[x];
    head[x]=now;
    w[now]=z;
    v[now]=y;
}
inline bool bfs()
{
    memset(deep,0,sizeof(deep));
    memcpy(cr,head,sizeof(head));//cr为当前弧数组
    deep[N]=1;
    que.push(N);
    while(!que.empty())
    {
        int x=que.front();
        que.pop();
        for(register int i=head[x];i;i=nex[i])
            if(w[i]&&!deep[v[i]])
            {
                que.push(v[i]);
                deep[v[i]]=deep[x]+1;
            }
    }
    return deep[0];
}
long long dfs(int u,long long f)
{
    if(!u||!f)	return f;
    register long long ans=0;
    for(register int &i=cr[u];i;i=nex[i])//当前弧优化
        if(w[i]&&deep[v[i]]==deep[u]+1)
        {
            long long d=dfs(v[i],min(f,w[i]));
            if(!d)	continue;
            w[i^1]+=d;
            w[i]-=d;
            ans+=d;
            f-=d;
        }
    if(!ans)	deep[u]=-1;
    return ans;
}
int main()
{
    n=read();
    for(register int i=1;i<=n;i++)
    {
        int x=read();
        add(i,0,x);
    }
    for(register int i=1;i<=n;i++)
    {
        int x=0;
        for(register int j=1;j<=n;j++)
        {
            int a=read();
            x+=a;
            if(i<j)
            {
                addedges(i,j,a<<1);
                addedges(j,i,a<<1);
            }
        }
        add(N,i,x);
        tot+=x;
    }
    while(bfs())
    while(int d=dfs(N,INF))	ans+=d;
    printf("%lld\n",tot-ans);
    return 0;
}
去除当期弧优化后莫名就A了
时间整整快了3倍
所以当前弧优化会有负优化吗?

回复

13 条回复,欢迎继续交流。

正在加载回复...