NC244809. Tidying Up
描述
输入描述
第一行两个整数
接下来行每行个整数,分别表示每个格子中鞋子的类型。
保证是偶数,并且到中每个数字都在中出现恰好次。
输出描述
一个整数,表示答案。
示例1
输入:
2 3 1 1 2 2 3 3
输出:
2
示例2
输入:
3 4 1 3 2 6 2 1 5 6 4 4 5 3
输出:
4
C++(clang++ 11.0.1) 解法, 执行用时: 514ms, 内存消耗: 1144K, 提交时间: 2022-11-28 11:06:30
#include <bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; typedef long long ll; const int maxn=7000; const int maxm=100005; const int inf=0x3f3f3f3f; int dis[maxn],mp[85][85]; int vis[maxn],pre[maxn]; int head[maxn],cnt; int n,m,sp,tp; ll ans=0; struct node{ int to,cap,cost,next; }e[maxm]; void add(int from,int to,int cap,int cost){ e[cnt].to=to; e[cnt].cap=cap; e[cnt].cost=cost; e[cnt].next=head[from]; head[from]=cnt++; e[cnt].to=from; e[cnt].cap=0; e[cnt].cost=-cost; e[cnt].next=head[to]; head[to]=cnt++; } bool spfa(int s,int t,int &flow,int &cost){ queue<int> q; memset(dis,inf,sizeof(dis)); memset(vis,0,sizeof(vis)); memset(pre,-1,sizeof(pre)); dis[s]=0; q.push(s); vis[s]=1; int d=inf; while(!q.empty()){ int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(e[i].cap>0&&dis[v]>dis[u]+e[i].cost){ dis[v]=dis[u]+e[i].cost; pre[v]=i; if(!vis[v]){ vis[v]=1; q.push(v); } } } } if(dis[t]==inf){ return false; } for(int i=pre[t];~i;i=pre[e[i^1].to]){ d=min(d,e[i].cap); } for(int i=pre[t];~i;i=pre[e[i^1].to]){ e[i].cap-=d; e[i^1].cap+=d; cost+=e[i].cost*d; } flow+=d; return true; } int mcmf(int s,int t){ int flow=0,cost=0; while(spfa(s,t,flow,cost)){ //cout<<flow<<" "<<cost<<endl; } return cost; } int G(int x,int y){ return (x-1)*m+y; } int Same(int xl,int yl,int xr,int yr){ return mp[xl][yl]!=mp[xr][yr]; } int main(){ memset(head,-1,sizeof(head)); ans=0; scanf("%d%d",&n,&m); sp=0;tp=m*n+1; rep(i,1,n) rep(j,1,m) scanf("%d",&mp[i][j]); rep(i,1,n){ rep(j,1,m){ if((i+j)&1){ add(sp,G(i,j),1,0); if(i>1) add(G(i,j),G(i-1,j),1,Same(i,j,i-1,j)); if(j>1) add(G(i,j),G(i,j-1),1,Same(i,j,i,j-1)); if(j<m) add(G(i,j),G(i,j+1),1,Same(i,j,i,j+1)); if(i<n) add(G(i,j),G(i+1,j),1,Same(i,j,i+1,j)); } else add(G(i,j),tp,1,0); } } cout<<mcmf(sp,tp)<<endl; return 0; }