萌新求助,样例都不行(样例都超时)

P4015 运输问题

所以您是不知道如何找死循环然后让万能的谷民帮您找么?
by MatrixCascade @ 2021-01-25 08:01:40


@[MatrixCascade](/user/154101) ~~差不多吧,只是我不知道建图哪里错了~~
by 听取MLE声一片 @ 2021-01-25 08:09:38


万能的谷民啊,我看什么都是网络流怎么办啊(滑稽
by 听取MLE声一片 @ 2021-01-25 08:11:13


@[听取MLE声一片](/user/253738) ~~那就用网络流做呗,说不定能比暴力多过几个点呢~~
by Alan_Zhao @ 2021-01-25 08:20:05


@[Alan_Zhao](/user/225625) 大草
by 听取MLE声一片 @ 2021-01-25 08:24:15


@[听取MLE声一片](/user/253738) 你建图没挂 应该是 EK 挂了
by Spasmodic @ 2021-01-25 08:31:39


@[听取MLE声一片](/user/253738) ~~dinic 不香吗,为啥要用 EK~~
by Alan_Zhao @ 2021-01-25 08:36:17


@[Alan_Zhao](/user/225625) ~~还没来得及改~~
by 听取MLE声一片 @ 2021-01-25 08:39:35


虽然我知道你早已 A 了此题, 但我还是要来帮以前的你 debug, 以此来练习我 de 的能力 文中有两处错误, 1. SPFA时的 `d` 数组初始化没完全. 2. 第二次 EK 前 `cost` 没有初始化 ```cpp #include<iostream> #include<cstdio> #include<cmath> #include<string> #include<cstring> #include<algorithm> #include<queue> #include<stack> #include<vector> #include<map> #include<complex> using namespace std; #define QAQ(x) cout<<x<<endl, exit(0); inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int inf=2147483647; int maxn,cost; int top=1,head[5001]; int dis[5001]; int n,m,s,t,book[5001],c[5001][5001],d[5001],e[5001]; struct point{ int v,w,val,next; }a[100001]; struct B{ int fa; int v; }b[5001]; inline void add(int u,int v,int val,int w){ a[++top].v=v; a[top].val=val; a[top].w=w; a[top].next=head[u]; head[u]=top; } bool spfa(){ queue<int> q; memset(b,0,sizeof(b)); memset(book,0,sizeof(book)); for(int i=0;i<=n+m+1;i++) // 注意结点数量 dis[i]=inf; dis[s]=0; q.push(s); book[s]=1; while(!q.empty()){ int u=q.front(); book[u]=0; q.pop(); for(int i=head[u];i;i=a[i].next){ int v=a[i].v,w=a[i].w; if(a[i].val>0&&dis[v]>dis[u]+w){ dis[v]=dis[u]+w; b[v].fa=u,b[v].v=i; if(book[v]==0){ q.push(v); book[v]=1; } } } } return dis[t]!=inf; } void EK(){ while(spfa()){ int minn=inf; for(int i=t;i!=s;i=b[i].fa) minn=min(minn,a[b[i].v].val); for(int i=t;i!=s;i=b[i].fa){ a[b[i].v].val-=minn; a[b[i].v^1].val+=minn; } maxn+=minn; cost+=minn*dis[t]; } return; } int main() { m=read(),n=read(); s=0; t=m+n+1; for(int i=1;i<=m;i++){ d[i]=read(); add(s,i,d[i],0); add(i,s,0,0); } for(int i=1;i<=n;i++){ e[i]=read(); add(i+m,t,e[i],0); add(t,i+m,0,0); } for(int i=1;i<=m;i++) for(int j=1;j<=n;j++){ c[i][j]=read(); add(i,j+m,inf,c[i][j]); add(j+m,i,0,-c[i][j]); } EK(); cout<<cost<<endl; cost = 0; // 其他都初始化了, 就 cost 没清零... top=1; memset(head,0,sizeof(head)); for(int i=1;i<=m;i++){ add(s,i,d[i],0); add(i,s,0,0); } for(int i=1;i<=n;i++){ add(i+m,t,e[i],0); add(t,i+m,0,0); } for(int i=1;i<=m;i++) for(int j=1;j<=n;j++){ add(i,j+m,inf,-c[i][j]); add(j+m,i,0,c[i][j]); } EK(); cout<<-cost; return 0; } ```
by OldPan @ 2022-05-03 09:48:32


@[OldPan](/user/374291) 您的MD爆了...
by FateReset_ @ 2023-07-25 21:00:21


|