2 条题解
-
0
#include<bits/stdc++.h> using namespace std; #define int long long const int N=1e6+10; const int inf=1e18; int n,m,st,ed,mincost,a[50][50],cnt[50]; struct node{int to,v,c,nxt;}e[N]; int head[N],cur[N],d[N],len; int vis[N]; void add(int x,int y,int w,int c) { e[++len]={y,w,-c,head[x]};head[x]=len; e[++len]={x,0,c,head[y]};head[y]=len; } bool spfa() { for(int i=0;i<=ed;i++)d[i]=inf; memset(vis,0,sizeof(vis)); queue<int>q; q.push(st); d[st]=0; vis[st]=1; while(!q.empty()) { int x=q.front();q.pop(); vis[x]=0; for(int i=head[x];i;i=e[i].nxt) { int y=e[i].to; if(e[i].v&&d[y]>d[x]+e[i].c) { d[y]=d[x]+e[i].c; if(!vis[y])q.push(y),vis[y]=1; } } } return d[ed]!=inf; } int dfs(int x,int res) { if(x==ed||!res)return res; vis[x]=1; int ans=0; for(int i=cur[x];i;i=e[i].nxt) { int y=e[i].to; cur[x]=i; if(!vis[y]&&e[i].v&&d[y]==d[x]+e[i].c) { int sum=dfs(y,min(res-ans,e[i].v)); e[i].v-=sum; e[i^1].v+=sum; mincost+=sum*e[i].c; ans+=sum; if(ans==res)break; } } vis[x]=0; return ans; } int dinic() { int ans=0,flow; while(spfa()) { memcpy(cur,head,sizeof(cur)); while((flow=dfs(st,inf)))ans+=flow; } return ans; } int getin(int x,int y){return (cnt[x-1]+y)*2-1;} int getout(int x,int y){return (cnt[x-1]+y)*2;} void solve(int p,int t) { len=1; memset(head,0,sizeof(head)); for(int i=1;i<=m;i++)add(st,getin(1,i),1,0); for(int i=1;i<=m+n-1;i++)add(getout(n,i),ed,inf,0); for(int i=1;i<=n;i++) { for(int j=1;j<=m+i-1;j++) { add(getin(i,j),getout(i,j),p,a[i][j]); if(i<n) { add(getout(i,j),getin(i+1,j),t,0); add(getout(i,j),getin(i+1,j+1),t,0); } } } mincost=0; dinic(); cout<<-mincost<<'\n'; } signed main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>m>>n; cnt[0]=0; for(int i=1;i<=n;i++)cnt[i]=cnt[i-1]+(m+i-1); st=0,ed=cnt[n]*2+1; for(int i=1;i<=n;i++) for(int j=1;j<=m+i-1;j++) cin>>a[i][j]; solve(1,1); solve(inf,1); solve(inf,inf); return 0; } -
0
#include<cstdio> #include<cstring> using namespace std; struct node { int y,c,d,flog,next,other; }a[210000];int len,last[21000],n,m,st,ed,f[30][60],ans,cost; struct node1 { int c,r,f; }zx[30][60]; void ins(int x,int y,int c,int d,int flog) { len++; a[len].y=y;a[len].c=c;a[len].d=d;a[len].flog=flog; a[len].next=last[x];last[x]=len; len++; a[len].y=x;a[len].c=0;a[len].d=-d;a[len].flog=0; a[len].next=last[y];last[y]=len; a[len].other=len-1; a[len-1].other=len; } int list[21000],head,tail,dis[21000],flow[21000],d[21000],b[21000]; bool v[21000]; inline int mymin(int x,int y){return x<y?x:y;} bool spfa() { memset(dis,20,sizeof(dis));v[st]=false;dis[st]=0; int inf=dis[st+1]; head=1;tail=2;list[head]=st; while(head!=tail) { int x=list[head]; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(a[k].c>0 && dis[x]+a[k].d<dis[y]) { dis[y]=dis[x]+a[k].d; flow[y]=mymin(flow[x],a[k].c); d[y]=x;b[y]=k; if(v[y]==true) { v[y]=false; if(dis[list[head+1]]>dis[y]) { int all=head; head--;if(head==0)head=ed+1; list[head]=list[all];list[all]=y; } else { list[tail++]=y;if(tail==ed+2)tail=1; } } } } head++;if(head==ed+2)head=1;v[x]=true; } if(dis[ed]==inf)return false; int y=ed,root=0; while(y>0) { root=b[y];y=d[y]; a[root].c-=flow[ed];a[a[root].other].c+=flow[ed]; } cost+=flow[ed]*dis[ed]; return true; } int main() { scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) { int edd=i+m-1; for(int j=1;j<=edd;j++) { scanf("%d",&zx[i][j].f); zx[i][j].r=ed+1;zx[i][j].c=ed+2;ed+=2; ins(zx[i][j].r,zx[i][j].c,1,-zx[i][j].f,1); } } ed++; for(int i=1;i<=m;i++)ins(st,zx[1][i].r,1,0,3); for(int i=1;i<n;i++) { int edd=m+i-1; for(int j=1;j<=edd;j++) { ins(zx[i][j].c,zx[i+1][j].r,1,0,2); ins(zx[i][j].c,zx[i+1][j+1].r,1,0,2); } } int edd=m+n-1; for(int i=1;i<=edd;i++)ins(zx[n][i].c,ed,1,0,1); flow[st]=999999999; memset(v,true,sizeof(v)); while(spfa()); printf("%d\n",-cost); for(int i=1;i<=len;i++) { if(a[i].flog==0)a[i].c=0; else if(a[i].flog==1)a[i].c=999999999; else a[i].c=1; } cost=0; while(spfa()); printf("%d\n",-cost); for(int i=1;i<=len;i++) { if(a[i].flog==0)a[i].c=0; else if(a[i].flog<=2)a[i].c=999999999; else a[i].c=1; } cost=0; while(spfa()); printf("%d\n",-cost); return 0; }
- 1
信息
- ID
- 960
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 8
- 已通过
- 3
- 上传者