社区讨论

TLE80pt求助

P4174[NOI2006] 最大获利参与者 2已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@luc50rgp
此快照首次捕获于
2024/03/29 12:02
2 年前
此快照最后确认于
2024/03/29 16:36
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int N,p,m,f,n,S;
struct node{
    long long to;
    long long f;
    long long next;
}e[5000000];
long long tot=1,head[80050],now[80050];
void add(long long u,long long v,long long f)
{
    e[++tot].f=f;
    e[tot].next=head[u];
    e[tot].to=v;
    head[u]=tot;
    e[++tot].f=0;
    e[tot].to=u;
    e[tot].next=head[v];
    head[v]=tot;
}
long long dis[80050];

long long s,t;
bool bfs()
{
    memset(dis,0,sizeof(dis));
    dis[s]=1;
    queue<int>q;q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        now[u]=head[u];
        for(int i=head[u];i;i=e[i].next)
        {
            int v=e[i].to;
            if(e[i].f>0&&dis[v]==0)
            {
                dis[v]=dis[u]+1;
                now[v]=head[v];
                q.push(v);
                if(v==t)return 1;
            }
        }
    }
    return 0;
}
long long mxflow;
long long dfs(int u,long long flow)
{
    if(u==t)return flow;
    long long k,res=0;
    for(int i=now[u];i;i=e[i].next)
    {
        int v=e[i].to;
        now[u]=i;
        if(e[i].f>0&&dis[v]==dis[u]+1)
        {
            k=dfs(v,min(flow,e[i].f));
            e[i].f-=k;
            e[i^1].f+=k;
            res+=k;
            flow-=k;
            if(e[i].f<=0)dis[v]=0;
            if(flow==0)return res;
        }
    }    
    return res;
}
long long read()
{
    long long x=0;char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x;
}
int main()
{
    freopen("1.in","r",stdin);
    s=69998,t=69997;
    n=read(),m=read();
    for(int i=1;i<=n;++i)
    {
        long long v=read();
        add(s,i,v);
    }
    long long sum;
    for(int i=1;i<=m;++i)
    {
        long long x=read(),y=read(),p=read();
        add(n+i,t,p);
        add(x,n+i,1000000000);
        add(y,n+i,1000000000);
        sum+=p;
    }
    while(bfs())mxflow+=dfs(s,1000000000);
    cout<<sum-mxflow<<endl;
    return 0;
}

回复

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

正在加载回复...