2 条题解
-
0
#include<bits/stdc++.h> using namespace std; #define int long long const int N=5005,M=100010; const int inf=1e18; int n,st,ed,mn; struct node{int to,v,c,nxt;}e[M<<1]; int head[N],cur[N],d[N],len; bool vis[N]; int c[60][60]; void add(int x,int y,int w,int cost) { e[++len]={y,w,cost,head[x]};head[x]=len; e[++len]={x,0,-cost,head[y]};head[y]=len; } bool spfa() { for(int i=0;i<=n*2+1;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; mn+=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; } signed main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n; st=0,ed=n*2+1,len=1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>c[i][j]; for(int i=1;i<=n;i++)add(st,i,1,0); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) add(i,j+n,1,c[i][j]); for(int i=1;i<=n;i++)add(i+n,ed,1,0); dinic(); cout<<mn<<'\n'; len=1; memset(head,0,sizeof(head)); mn=0; for(int i=1;i<=n;i++)add(st,i,1,0); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) add(i,j+n,1,-c[i][j]); for(int i=1;i<=n;i++)add(i+n,ed,1,0); dinic(); cout<<-mn<<'\n'; return 0; } -
0
#include<cstdio> #include<cstring> using namespace std; struct node { int y,c,d,next,other; }a[21000];int len,last[400],n,st,ed,cost,m,f[105][105]; void ins(int x,int y,int c,int d) { len++; a[len].y=y;a[len].c=c;a[len].d=d; a[len].next=last[x];last[x]=len; len++; a[len].y=x;a[len].c=0;a[len].d=-d; a[len].next=last[y];last[y]=len; a[len].other=len-1;a[len-1].other=len; } int list[400],head,tail,dis[400],flow[400],d[400],b[400]; bool v[400]; inline int mymin(int x,int y){return x<y?x:y;} bool spfa() { memset(dis,20,sizeof(dis));dis[st]=0; head=1;tail=2;list[head]=st; int inf=dis[ed+1]; 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); b[y]=k;d[y]=x; if(v[y]==true) { v[y]=false; if(d[list[head+1]]>d[y]) { int all=head; head--;if(head==0)head=m; list[head]=list[all];list[all]=y; } else { list[tail++]=y;if(tail==m+1)tail=1; } } } } head++;if(head==m+1)head=1; v[x]=true; } return dis[ed]!=inf; } int main() { scanf("%d",&n);st=0;ed=n*2+1;m=n*2+2; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&f[i][j]); ins(i,j+n,1,f[i][j]); } ins(st,i,1,0);ins(i+n,ed,1,0); } flow[st]=999999999; memset(v,true,sizeof(v)); while(spfa()) { 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+=dis[ed]*flow[ed]; } printf("%d\n",cost);cost=0; len=0;memset(last,0,sizeof(last)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++)ins(i,j+n,1,-f[i][j]); ins(st,i,1,0);ins(i+n,ed,1,0); } while(spfa()) { 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+=dis[ed]*flow[ed]; } printf("%d\n",-cost); return 0; }
- 1
信息
- ID
- 955
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 8
- 已通过
- 7
- 上传者