为啥这题不加当前弧优化会T???
查看原帖
为啥这题不加当前弧优化会T???
581928
jasonliujiahua楼主2023/10/28 15:29
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1010,maxn=2e5+10,inf=1e18;
int n,s,t,cnt=1,ans,a[N][N],b[N][N],dis[maxn],rad[maxn];
bool in[maxn],vis[maxn];
struct edge
{
    int u,v,w,c,nxt;
}e[maxn<<1];
int head[maxn];
inline void add(int x,int y,int z,int c)
{
    e[++cnt]=(edge){x,y,z,c,head[x]};
    head[x]=cnt;
    e[++cnt]=(edge){y,x,0,-c,head[y]};
    head[y]=cnt;
}
void init()
{
    cin>>n;
    s=n+n+1,t=n+n+2;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) 
            cin>>a[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) 
            cin>>b[i][j];
    for(int i=1;i<=n;i++)
    {
        add(s,i,1,0);
        add(i+n,t,1,0);
        for(int j=1;j<=n;j++)
        {
            add(i,j+n,1,a[i][j]*b[j][i]);
        }
    }
}
inline bool spfa()
{
    memset(dis,-0x3f,sizeof(dis));
    dis[s]=0;
    in[s]=1;
    queue<int> q;
    q.push(s);
    while(q.size())
    {
        int u=q.front();
        q.pop();
        in[u]=0;
        rad[u]=head[u];
        for(int i=head[u];i;i=e[i].nxt)
        {
            int v=e[i].v,c=e[i].c,w=e[i].w;
            if(dis[v]>=dis[u]+c || !w) continue;
            dis[v]=dis[u]+c;
            if(!in[v])
            {
                in[v]=1;
                q.push(v);
            }
        }
    }
    return dis[t]!=dis[0];
}
int dfs(int u,int fl)
{
    if(u==t)
    {
        ans+=dis[t]*fl;
        return fl;
    }
    int rest=fl;
    vis[u]=1;
    for(int i=rad[u];i;i=e[i].nxt)
    {
        rad[u]=i;
        int v=e[i].v;
        if(dis[v]!=dis[u]+e[i].c || !e[i].w || vis[v]) continue;
        int tmp=dfs(v,min(rest,e[i].w));
        e[i].w-=tmp;
        e[i^1].w+=tmp;
        rest-=tmp;
        if(!rest) break;
    }
    vis[u]=0;
    return fl-rest;
}
void dinic()
{
    while(spfa()) dfs(s,inf);
    cout<<ans;
}
signed main()
{
    // freopen("1.in","r",stdin);
    // freopen("1.out","w",stdout);
    init();
    dinic();
    return 0;
}
2023/10/28 15:29
加载中...