1. 程式人生 > >bzoj 4823: [Cqoi2017]老C的方塊【最大權閉合子圖】

bzoj 4823: [Cqoi2017]老C的方塊【最大權閉合子圖】

tor gin str push i++ 依賴 info cto truct

參考:https://www.cnblogs.com/neighthorn/p/6705785.html
並不是黑白染色而是三色染色(還有四色的,不過是一個意思
技術分享圖片
仔細觀察一下不合法情況,可以發現都是特殊邊兩邊有格子並且兩個黑格子都在的時候黃藍不能同在,所以(黃---黑)(黑---藍)(黑---黑)都是最大權閉合子圖中的依賴邊
直接按照模型建就行,把黃藍當成黑白染色。
……但是為什麽不能用struct代替map呢QAQ

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<vector>
#include<map> #include<algorithm> using namespace std; const int N=100005,mv[2][3][2]={-1,0,1,0,0,1,-1,0,1,0,0,-1},inf=1e9; int c,r,n,s,t,le[N],h[N],cnt=1; vector<int>v[N]; // struct que // { // int x,y; // que(int X=0,int Y=0) // { // x=X,y=Y; // } // bool operator < (const que &a) const
// { // return x>a.x; // } // }; // map<que,que>mp; map< pair<int,int>,pair<int,int> > mp; struct qwe { int ne,to,va; }e[N*20]; int read() { int r=0,f=1; char p=getchar(); while(p>‘9‘||p<‘0‘) { if(p==‘-‘) f=-1; p=getchar(); } while
(p>=‘0‘&&p<=‘9‘) { r=r*10+p-48; p=getchar(); } return r*f; } void add(int u,int v,int w) { cnt++; e[cnt].ne=h[u]; e[cnt].to=v; e[cnt].va=w; h[u]=cnt; } void ins(int u,int v,int w) {//cout<<u<<" "<<v<<" "<<w<<endl; add(u,v,w); add(v,u,0); } int bfs() { queue<int>q; memset(le,0,sizeof(le)); le[s]=1; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=h[u];i;i=e[i].ne) if(e[i].va>0&&!le[e[i].to]) { le[e[i].to]=le[u]+1; q.push(e[i].to); } } return le[t]; } int dfs(int u,int f) { if(!f||u==t) return f; int us=0; for(int i=h[u];i;i=e[i].ne) if(e[i].va>0&&le[e[i].to]==le[u]+1) { int t=dfs(e[i].to,min(e[i].va,f-us)); e[i].va-=t; e[i^1].va+=t; us+=t; } if(!us) le[u]=0; return us; } int dinic() { int re=0; while(bfs()) re+=dfs(s,inf); return re; } int main() { c=read(),r=read(),n=read(); s=0,t=n+1; for(int i=1;i<=n;i++) { int y=read(),x=read(),w=read(); // mp[que(x,y)]=que(i,w); // v[x].push_back(y); mp[make_pair(x,y)]=make_pair(i,w); v[x].push_back(y); } for(int i=1;i<=r;i++) sort(v[i].begin(),v[i].end()); for(int i=1;i<=r;i++) for(int j=0;j<v[i].size();j++) { int x=i,y=v[i][j]; // if((x&1)&&y%4==1) // { // if(j<v[i].size()-1&&v[i][j+1]==y+1) // ins(mp[que(x,y)].x,mp[que(x,y+1)].x,min(mp[que(x,y)].y,mp[que(x,y+1)].y)); // } // else if((x&1)&&y%4==2) // { // for(int k=0;k<3;k++) // if(mp.find(que(x+mv[0][k][0],y+mv[0][k][1]))!=mp.end()) // ins(mp[que(x,y)].x,mp[que(x+mv[0][k][0],y+mv[0][k][1])].x,inf); // } // else if((x&1)==0&&y%4==0) // { // if(j>0&&v[i][j-1]==y-1) // ins(mp[que(x,y)].x,mp[que(x,y-1)].x,min(mp[que(x,y)].y,mp[que(x,y-1)].y)); // } // else if((x&1)==0&&y%4==3) // { // for(int k=0;k<3;k++) // if(mp.find(que(x+mv[1][k][0],y+mv[1][k][1]))!=mp.end()) // ins(mp[que(x,y)].x,mp[que(x+mv[1][k][0],y+mv[1][k][1])].x,inf); // } // else if(((x+y)&1)&&(x&1)) // { // for(int k=0;k<3;k++) // if(mp.find(que(x+mv[0][k][0],y+mv[0][k][1]))!=mp.end()) // ins(mp[que(x,y)].x,mp[que(x+mv[0][k][0],y+mv[0][k][1])].x,inf); // ins(s,mp[que(x,y)].x,mp[que(x,y)].y); // } // else if((x&1)&&((x+y)&1)==0) // { // for(int k=0;k<3;k++) // if(mp.find(que(x+mv[1][k][0],y+mv[1][k][1]))!=mp.end()) // ins(mp[que(x+mv[1][k][0],y+mv[1][k][1])].x,mp[que(x,y)].x,inf); // ins(mp[que(x,y)].x,t,mp[que(x,y)].y); // } // else if(((x+y)&1)&&(x&1)==0) // { // for(int k=0;k<3;k++) // if(mp.find(que(x+mv[1][k][0],y+mv[1][k][1]))!=mp.end()) // ins(mp[que(x,y)].x,mp[que(x+mv[1][k][0],y+mv[1][k][1])].x,inf); // ins(s,mp[que(x,y)].x,mp[que(x,y)].y); // } // else // { // for(int k=0;k<3;k++) // if(mp.find(que(x+mv[0][k][0],y+mv[0][k][1]))!=mp.end()) // ins(mp[que(x+mv[0][k][0],y+mv[0][k][1])].x,mp[que(x,y)].x,inf); // ins(mp[que(x,y)].x,t,mp[que(x,y)].y); // } if((x&1)&&y%4==1) { if(j<v[i].size()-1&&v[i][j+1]==y+1) ins(mp[make_pair(x,y)].first,mp[make_pair(x,y+1)].first,min(mp[make_pair(x,y)].second,mp[make_pair(x,y+1)].second)); } else if((x&1)&&y%4==2) { for(int k=0; k<3; k++) if(mp.find(make_pair(x+mv[0][k][0],y+mv[0][k][1]))!=mp.end()) ins(mp[make_pair(x,y)].first,mp[make_pair(x+mv[0][k][0],y+mv[0][k][1])].first,inf); } else if((x&1)==0&&y%4==0) { if(j>0&&v[i][j-1]==y-1) ins(mp[make_pair(x,y)].first,mp[make_pair(x,y-1)].first,min(mp[make_pair(x,y)].second,mp[make_pair(x,y-1)].second)); } else if((x&1)==0&&y%4==3) { for(int k=0; k<3; k++) if(mp.find(make_pair(x+mv[1][k][0],y+mv[1][k][1]))!=mp.end()) ins(mp[make_pair(x,y)].first,mp[make_pair(x+mv[1][k][0],y+mv[1][k][1])].first,inf); } else if(((x+y)&1)&&(x&1)) { for(int k=0; k<3; k++) if(mp.find(make_pair(x+mv[0][k][0],y+mv[0][k][1]))!=mp.end()) ins(mp[make_pair(x,y)].first,mp[make_pair(x+mv[0][k][0],y+mv[0][k][1])].first,inf); ins(s,mp[make_pair(x,y)].first,mp[make_pair(x,y)].second); } else if((x&1)&&((x+y)&1)==0) { for(int k=0; k<3; k++) if(mp.find(make_pair(x+mv[1][k][0],y+mv[1][k][1]))!=mp.end()) ins(mp[make_pair(x+mv[1][k][0],y+mv[1][k][1])].first,mp[make_pair(x,y)].first,inf); ins(mp[make_pair(x,y)].first,t,mp[make_pair(x,y)].second); } else if(((x+y)&1)&&(x&1)==0) { for(int k=0; k<3; k++) if(mp.find(make_pair(x+mv[1][k][0],y+mv[1][k][1]))!=mp.end()) ins(mp[make_pair(x,y)].first,mp[make_pair(x+mv[1][k][0],y+mv[1][k][1])].first,inf); ins(s,mp[make_pair(x,y)].first,mp[make_pair(x,y)].second); } else { for(int k=0; k<3; k++) if(mp.find(make_pair(x+mv[0][k][0],y+mv[0][k][1]))!=mp.end()) ins(mp[make_pair(x+mv[0][k][0],y+mv[0][k][1])].first,mp[make_pair(x,y)].first,inf); ins(mp[make_pair(x,y)].first,t,mp[make_pair(x,y)].second); } } printf("%d\n",dinic()); return 0; }

bzoj 4823: [Cqoi2017]老C的方塊【最大權閉合子圖】