为什么我这个代码注释部分开了就错了?
查看原帖
为什么我这个代码注释部分开了就错了?
1229671
Greenqwq楼主2024/5/4 20:23
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define int long long

using namespace std;

const int N = 500010,M = (N+10000)*2+10,INT = 1e9+7;

int e[M],ne[M],f[M],h[N],idx;
int cur[N],d[N],A[N];//A[i]表示入边-出边
int n,m,S,T,C,D;

void add(int a,int b,int c){
    e[idx]=b,f[idx]=c,ne[idx]=h[a],h[a]=idx++;
    e[idx]=a,f[idx]=0,ne[idx]=h[b],h[b]=idx++;
}

bool bfs(){
    queue<int>q;
    
    memset(d,-1,sizeof d);
    
    d[S]=0;
    
    q.push(S);
    
    cur[S]=h[S];
    
    while(q.size()){
        int t=q.front();
        q.pop();
        
        for(int i=h[t];~i;i=ne[i]){
            int ver=e[i];
            
            if(d[ver]==-1&&f[i]){
                d[ver]=d[t]+1;
                cur[ver]=h[ver];
                if(ver==T)return true;
                q.push(ver);
            }
        }
    }
    return false;
}

int find(int u,int lim){
    if(u==T)return lim;
    
    int flow=0;
    
    for(int i=cur[u];~i&&flow<lim;i=ne[i]){
        cur[u]=i;
        
        int ver=e[i];
        
        if(d[ver]==d[u]+1&&f[i]){
            int t=find(ver,min(f[i],lim-flow));
            if(!t)d[ver]=-1;
            f[i]-=t,f[i^1]+=t,flow+=t;
        }
    }
    return flow;
    
}

int dinic(){
    int r=0,flow;
    
    while(bfs())while((flow=find(S,INT)))r+=flow;
    
    return r;
}

signed main(){
    while(cin>>n>>m){
        memset(A,0,sizeof A);
        memset(h,-1,sizeof h);
        idx=0;
        int s,t;
        s=0,t=n+m+1;
        
        for(int i=1;i<=m;i++){
            int x;
            cin>>x;
            add(s,i,INT-x);//因为至少要拍x张
            A[s]-=x,A[i]+=x;
        }
        
        for(int i=1;i<=n;i++){
            cin>>C>>D;
            add(m+i,t,D);//因为每天拍摄不超过D张
            for(int j=1;j<=C;j++){
                // int a,b,c;
                // cin>>a>>b>>c;
                // add(a+1,m+i,c-b);
                // A[a+1]-=c,A[m+i]+=c;
                int x,L,R;
                cin>>x>>L>>R;
                add(x+1,m+i,R-L);
                A[x+1]-=L,A[m+i]+=L;
            }
        }
        
        S=n+m+2,T=n+m+3;
        int tot=0;
        for(int i=0;i<=n+m+1;i++){
            if(A[i]>0)add(S,i,A[i]),tot+=A[i];
            else if(A[i]<0)add(i,T,-A[i]);
        }
        
        add(t,s,INT);
        
        if(dinic()!=tot){
            puts("-1");
            puts("");
        }else{
            int res=f[idx-1];
            
            f[idx-1]=f[idx-2]=0;
            
            S=s,T=t;
            
            cout<<(res+dinic())<<endl;
            puts("");
        }
        
    }
    return 0;
}
2024/5/4 20:23
加载中...