在重庆的两件衣服的冬天里 题解
题目描述
题解
这道题肯定被喷,毕竟太版了,不过就当送分吧
考虑染色。然后我们发现通过走 红->黄->蓝->绿 就可以走完所有的情况。
那么这道题就做完了,把格子按点分成四层。
很板吧?肯定被喷的。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
const int INF=0x3f3f3f3f;
struct zz{
int u,w,id;
};
vector<zz> v[1000005];
struct Dinic{
int dist[1000005],be[1000005];
int s,t;
void Add(int x,int y,int z){
int idx=v[x].size(),idy=v[y].size();
v[x].push_back((zz){y,z,idy});
v[y].push_back((zz){x,0,idx});
}
bool BFS(){
bool f=0;memset(dist,-1,sizeof dist);
queue<int> q;q.push(s);
dist[s]=be[s]=0;
while(!q.empty()){
int x=q.front();q.pop();
int siz=v[x].size();
for(int i=0;i<siz;i++){
int y=v[x][i].u,w=v[x][i].w;
if(!w||dist[y]!=-1) continue;
q.push(y),be[y]=0,dist[y]=dist[x]+1;
if(y==t) f=1;
}
}
return f;
}
int DFS(int x,int sum){
if(x==t||!sum) return sum;
int siz=v[x].size(),ans=0;
for(int i=0;i<siz;i++){
int y=v[x][i].u,w=v[x][i].w,id=v[x][i].id;be[x]=i;
if(!w||dist[x]!=dist[y]-1) continue;
int now=DFS(y,min(sum-ans,w));
if(!now) dist[y]=0;
v[x][i].w-=now,v[y][id].w+=now,ans+=now;
}
return ans;
}
int dinic(){
int ans=0,now=0;
while(BFS()) while(now=DFS(s,INF)) ans+=now;
return ans;
}
}T;
int n,m,k,tot=0;
struct ss{
int x,y,col,val;
}a[1000005];
map<pii ,int > f;
bool Check(int x,int y){ return !(x<=0||x>n||y<=0||y>m); }
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL), std::cout.tie(NULL);
cin>>n>>m>>k;T.s=0,T.t=k*2+1;
for(int i=1;i<=k;i++){
cin>>a[i].x>>a[i].y>>a[i].val;
if(a[i].x%4==0) a[i].col=4-(a[i].y&1);
if(a[i].x%4==1) a[i].col=2-(a[i].y&1);
if(a[i].x%4==2) a[i].col=3+(a[i].y&1);
if(a[i].x%4==3) a[i].col=1+(a[i].y&1);
f[mp(a[i].x,a[i].y)]=i;
}
for(int i=1;i<=k;i++){
int x=a[i].x,y=a[i].y;T.Add(i,i+k,a[i].val);
if(a[i].col==1||a[i].col==3){
int fx=x,fy=y-1;
if(Check(fx,fy)&&f[mp(fx,fy)]) T.Add(i+k,f[mp(fx,fy)],INF);
fx=x,fy=y+1;
if(Check(fx,fy)&&f[mp(fx,fy)]) T.Add(i+k,f[mp(fx,fy)],INF);
}
if(a[i].col==2){
int fx=x-1,fy=y-1;
if(Check(fx,fy)&&f[mp(fx,fy)]) T.Add(i+k,f[mp(fx,fy)],INF);
fx=x+1,fy=y;
if(Check(fx,fy)&&f[mp(fx,fy)]) T.Add(i+k,f[mp(fx,fy)],INF);
}
if(a[i].col==1) T.Add(T.s,i,INF);
if(a[i].col==4) T.Add(i+k,T.t,INF);
}
cout<<T.dinic();
return 0;
}