社区讨论

玄关求条

P5192Shoot the Bullet | 东方文花帖参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mdir0bcm
此快照首次捕获于
2025/07/25 19:38
8 个月前
此快照最后确认于
2025/11/04 03:44
4 个月前
查看原帖
用的是ISAP,为啥T了
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5,inf=1<<30;
int cnt=1,head[N],dep[N],gap[N],liu[N];
//        前向星  深度          流量 
int maxflow;
int n,m,s,t,nn,yuan,shen;
struct Node{
    int u,v,w;
}node[250005];
inline void addedge(int u,int v,int w){
    node[++cnt].v=v;
    node[cnt].w=w;
    node[cnt].u=head[u];
    head[u]=cnt;
	node[++cnt].v=u;
	node[cnt].w=0;
	node[cnt].u=head[v];
	head[v]=cnt;
}
void bfs(){
    memset(dep,-1,sizeof(dep));
    memset(gap,0,sizeof(gap));
    dep[t]=0;
    gap[0]=1;
    queue<int>q;
    q.push(t);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=head[u];i;i=node[i].u){
            int v=node[i].v;
            if(dep[v]!=-1)continue;
            q.push(v);
            dep[v]=dep[u]+1;
            gap[dep[v]]++;
        }
    }
    return;
}
int dfs(int u,int flow){
    if(u==t){
        maxflow+=flow;
        return flow;
    }
    int used=0;
    for(int i=head[u];i;i=node[i].u){
        int d=node[i].v;
        if(node[i].w&&dep[d]+1==dep[u]){
            int mi=dfs(d,min(node[i].w,flow-used));
            if(mi){
                node[i].w-=mi;
                node[i^1].w+=mi;
                used+=mi;
            }
            if(used==flow)return used;
        }
    }
    --gap[dep[u]];
    if(gap[dep[u]]==0)dep[s]=n+1;
    dep[u]++;
    gap[dep[u]]++;
    return used; 
}
long long ISAP(){
    maxflow=0;
    bfs();
    while(dep[s]<nn)dfs(s,inf);
    return maxflow;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	while(cin>>n>>m){
		memset(node,0,sizeof node);
		memset(liu,0,sizeof liu);
		yuan=1,shen=n+m+2,nn=n+m+2;		
		for(int i=2;i<=m+1;++i){	
			int G;
			cin>>G;
			addedge(s,i,inf-G);	
			liu[i]+=G;
			liu[s]-=G;
		}
		for(int i=m+2;i<=m+n+1;++i){	
			int C,D;
			cin>>C>>D;
			addedge(i,t,D);
			for(int j=1;j<=C;++j){		
				int T,L,R;		
				cin>>T>>L>>R;
				T+=2;		
				addedge(T,i,R-L);	
				liu[T]-=L;			 
				liu[i]+=L; 
			}
		}
		s=0,t=n+m+3;		
		int outflow=0;		
		for(int i=1;i<=nn;++i){		
			if(liu[i]>0){
				addedge(yuan,i,liu[i]);
				outflow+=liu[i]; 
			}else if(liu[i]<0)addedge(i,shen,-liu[i]);
		}
		addedge(t,s,inf);		
		if(ISAP()<outflow)cout<<"-1\n\n";		
		else{
			int res=node[cnt-1].w;		
			node[cnt-1].w=node[cnt-2].w=0;	
			s=yuan,t=shen;		
			cout<<res+ISAP()<<"\n\n"; 		
		}
	}
	return 0;
}

回复

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

正在加载回复...