1. 程式人生 > >BZOJ 1001 [BJOI 2006] 狼抓兔子

BZOJ 1001 [BJOI 2006] 狼抓兔子

har day .... class isa inline pri through spfa

BZOJ題面

瑾以此題紀念博主邁出沖刺省選的第一步

打眼一看,這不是裸的最小割嗎?

最小割 == 最大流

然後 5 分鐘碼完 ISAP

交上去一看......TLE......懵逼......

然後進行了一波沒有卵用的優化常數......

(去他媽的 1e6 個點,3e6 條邊!!!)

問了度娘,才知道這題的圖是 ‘平面圖’ ;

平面圖的最小割和最大流可以通過將其轉換成對偶圖跑最短路求解(漲姿勢)

那麽什麽是對偶圖呢?

通俗的講,對偶圖就是把原圖的點換成面(邊圍成的區域),面換成點而無向邊連接原圖的面

如下圖,藍色的是原圖,紅色的是對偶圖,綠色的是對偶圖最短路(最小環刪去了s-t的邊)(也是原圖最小割);


技術分享圖片

如果還不明白,請參考——周冬 Dalao《淺析最大最小定理在信息學競賽中的應用

註意:在平面圖中,最外面還有一個無窮大的面;

然後就可以愉快的跑 SPFA 了;

所以說,有了這個 AC 這題豈不是很簡單嘍

No,No,No,除了搞來搞去能把你繞暈的建圖之外

本題還有一個非常非常坑的地方沒有之一!!我查了3 Days

那就是

n == 1 || m ==1 啊!!(出數據的MMP)

AC 代碼:

#include<bits/stdc++.h>
using namespace std;
int dis[2000100],used[2000100],point[6000100
]; // 2e6 個點,6e6 條邊... int cnt; queue<int>q; struct edge{ int u,v,next; }e[6000100]; inline int read(){ // 據說不加快讀容易 TLE int x=0; char ch=getchar(); while(ch>9||ch<0) ch=getchar(); while(ch>=0&&ch<=9) x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); return
x; } inline void ad(int x,int y,int z){ e[++cnt].u=y; e[cnt].v=z; e[cnt].next=point[x]; point[x]=cnt; } inline void add(int x,int y,int z){ // 無向邊 偷懶... ad(x,y,z); ad(y,x,z); } int spfa(int s,int t){ // SPFA 板子一枚 memset(dis,0x3f,sizeof(dis)); q.push(s); used[s]=1; dis[s]=0; while(!q.empty()){ s=q.front(); q.pop(); used[s]=0; for(int i=point[s];i;i=e[i].next) if(dis[e[i].u]>dis[s]+e[i].v){ dis[e[i].u]=dis[s]+e[i].v; if(!used[e[i].u]){ used[e[i].u]=1; q.push(e[i].u); } } } return dis[t]; } int main(){ int n,m,x,s=0; n=read(),m=read(); if(n==1||m==1){ // 特判很重要! s=0x3fffffff; for(int i=1;i<max(n,m);i++){ x=read(); s=min(s,x); } printf("%d\n",s); return 0; } int t=2*(n-1)*(m-1)+1; // t:終點 for(int i=1;i<=n*(m-1);i++){ x=read(); add(min(2*i,t),max(0,2*(i-m)+1),x); // 橫向邊 } for(int i=1;i<=(n-1)*m;i++){ x=read(); s++; if(i%m!=0&&i%m!=1) s++,add(s-1,s,x); // 縱向邊 else if(i%m==0) add(s,0,x); else add(t,s,x); } for(int i=1;i<=(m-1)*(n-1);i++){ x=read(); add(2*i-1,2*i,x); // 斜向邊 } printf("%d\n",spfa(0,t)); return 0; }

By The_Seventh

2017-12-24 11:19:04

BZOJ 1001 [BJOI 2006] 狼抓兔子