费用流求助(码风良好)

P1251 餐巾计划问题

freopen是调试时加的
by Zikl @ 2023-03-25 21:45:42


```cpp edg[i^1]+=incf[i]; ``` 刚刚发现了一个小错误
by Zikl @ 2023-03-25 21:46:17


90分了,我再找找有没有错误
by Zikl @ 2023-03-25 21:47:09


@[Zikl](/user/300166) 可怜的孩子没人调代码,摸摸
by Zikl @ 2023-03-25 21:48:37


@[Zikl](/user/300166) 难过力,改不出来,哭泣
by Zikl @ 2023-03-25 21:56:39


```cpp #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<queue> #define int long long const int inf=1<<30; using namespace std; int n,ct,s=0,t=300005,p,m1,f,n1,ss,ans; int head[500005],ver[500005],Next[500005],edg[500005],cost[500005],tot=1; void add(int x,int y,int z,int c){ ver[++tot]=y,Next[tot]=head[x],head[x]=tot,edg[tot]=z,cost[tot]=c; ver[++tot]=x,Next[tot]=head[y],head[y]=tot,edg[tot]=0,cost[tot]=-c; } int pre[500005],dis[500005],incf[500005],inq[500005]; bool spfa(){ for(int i=0;i<=500005;i++) dis[i]=inf,inq[i]=0; queue<int>q; q.push(s); inq[s]=1; dis[s]=0; incf[s]=inf; while(q.size()){ int x=q.front(); q.pop(); inq[x]=0; for(int i=head[x];i;i=Next[i]){ int y=ver[i]; if(!edg[i]) continue; if(dis[y]>dis[x]+cost[i]){ dis[y]=dis[x]+cost[i]; incf[y]=min(incf[x],edg[i]); pre[y]=i; if(!inq[y]){ inq[y]=1; q.push(y); } } } } return dis[t]!=inf; } void Update(){ int x=t; while(x!=s){ int i=pre[x]; edg[i]-=incf[t]; edg[i^1]+=incf[t]; x=ver[i^1]; } ans+=dis[t]*incf[t]; } signed main(){ // freopen("EK.in","r",stdin); // freopen("EK.out","w",stdout); ios::sync_with_stdio(0); cin>>n; for(int i=1;i<=n;i++){ cin>>ct; add(s,i,ct,0); add(i+n,t,ct,0); } cin>>p>>m1>>f>>n1>>ss; for(int i=1;i<=n;i++){ if(i+1<=n) add(i,i+1,inf,0); if(i+m1<=n) add(i,i+n+m1,inf,f); if(i<=n1) add(i,i+n+n1,inf,ss); add(s,i+n,inf,p); } while(spfa()){ Update(); } cout<<ans; return 0; } ``` 改不出来......
by Zikl @ 2023-03-25 22:09:52


改出来力!开心力! ```cpp #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<queue> #define int long long const int inf=1<<30; using namespace std; int n,ct,s=0,t=300005,p,m1,f,n1,ss,ans; int head[500005],ver[500005],Next[500005],edg[500005],cost[500005],tot=1; void add(int x,int y,int z,int c){ ver[++tot]=y,Next[tot]=head[x],head[x]=tot,edg[tot]=z,cost[tot]=c; ver[++tot]=x,Next[tot]=head[y],head[y]=tot,edg[tot]=0,cost[tot]=-c; } int pre[500005],dis[500005],incf[500005],inq[500005]; bool spfa(){ for(int i=0;i<=500005;i++) dis[i]=inf,inq[i]=0; queue<int>q; q.push(s); inq[s]=1; dis[s]=0; incf[s]=inf; while(q.size()){ int x=q.front(); q.pop(); inq[x]=0; for(int i=head[x];i;i=Next[i]){ int y=ver[i]; if(!edg[i]) continue; if(dis[y]>dis[x]+cost[i]){ dis[y]=dis[x]+cost[i]; incf[y]=min(incf[x],edg[i]); pre[y]=i; if(!inq[y]){ inq[y]=1; q.push(y); } } } } return dis[t]!=inf; } void Update(){ int x=t; while(x!=s){ int i=pre[x]; edg[i]-=incf[t]; edg[i^1]+=incf[t]; x=ver[i^1]; } ans+=dis[t]*incf[t]; } signed main(){ // freopen("EK.in","r",stdin); // freopen("EK.out","w",stdout); ios::sync_with_stdio(0); cin>>n; for(int i=1;i<=n;i++){ cin>>ct; add(s,i,ct,0); add(i+n,t,ct,0); } cin>>p>>m1>>f>>n1>>ss; for(int i=1;i<=n;i++){ if(i+1<=n) add(i,i+1,inf,0); if(i+m1<=n) add(i,i+n+m1,inf,f); if(i<=n) add(i,i+n+n1,inf,ss); add(s,i+n,inf,p); } while(spfa()){ Update(); } cout<<ans; return 0; } ``` 这里错了 ```cpp if(i<=n1) add(i,i+n+n1,inf,ss); ``` 应该是 ```cpp if(i<=n) add(i,i+n+n1,inf,ss); ```
by Zikl @ 2023-03-25 22:14:50


@[Zikl](/user/300166) 还有个问题,样例太水测不出来 ```cpp if(i<=n) add(i,i+n+n1,inf,ss); ``` ```cpp if(i+n1<=n) add(i,i+n+n1,inf,ss); ```
by Zikl @ 2023-03-25 22:46:42


你是怎么做到的自己和自己说话的......
by IQoQI @ 2023-03-27 22:49:50


@[IQoQI](/user/322422) 多亏了每天的高强度florr训练
by Zikl @ 2023-03-27 23:27:03


| 下一页