考察:最小割的真正含義
我們知道最大流在意義上與最小割完全不同
但是最大流在數值上與最小割一樣
本題也就是考察了在最大流上跑最小割的含義。
如何斷定一條邊被割斷:反向邊流量為w原邊流量為0
這說明水流全部從這裡流走了,也就是最小割。
看問題:
「問題一:是否存在乙個最小代價路徑切斷方案,其中該道路被切斷? 問題二:是否對任何乙個最小代價路徑切斷方案,都有該道路被切斷? 現在請你回答這兩個問題。」
請冷靜思考:
這現在的參量網路是一張類分層圖。
只要把割斷的邊無視,那麼這就是幾塊。
而且這也就成了混合圖
我們考慮強聯通關係。
第一s與t一定不在一起,否則圖並沒有割斷。
其次當一條邊(w=0):u,v的u,v不在一起,那麼他們一定可以被選擇在一條最小割上
因為割斷它圖並沒有聯通。
對於問題二,只要u和s在一起v和t在一起那麼說明他們必須被割,否則圖永遠聯通。
#includeusing namespace std;
const int n=1e6+1000;
const int inf=1e9+7;
inline void read(int &x)
while(ch>='0'&&ch<='9')
x*=f;
}struct front_stare[n*2];
int cnt=1;
int first[n]={};
void addedge(int u,int v,int w)
void add(int u,int v,int w)
int s;
int t;
int n,m;
int d[n]={};
queueq;
bool bfs()
} }return d[t]!=-1;
}int dfs(int st,int ed,int nowdat)
int dat=0;
for(int i=first[st];i;i=e[i].nxt)
} }if(!dat)
return dat;
}int dinic()
return ret;}//
int dfn[n]={};
int low[n]={};
int color[n]={};
int vis[n]={};
int scc=0;
int tot=0;
stackst;
void tarjan(int u)
else
}} }
if(low[u]==dfn[u])while(x!=u); }}
int main()
dinic();
for(int i=1;i<=n;i++)
} for(int i=2;i<=cnt;i+=2)
}}
省選專練APIO2009Oil採油區域
神仙題難點在於 實現 這狗日的題。首先暴力是這樣的 列舉三個座標 這是n 6做法,沒什麼卵用 但是我們發現把一張圖分割成3塊那麼可以做 但是問題是這是情況多多的 所以成了碼農題 includeusing namespace std const int n 1801 int sum n n int a...
省選專練SCOI2005掃雷
這是乙個智商檢測題 狀壓dp。如果你玩過掃雷,並且內心有一棵平衡樹 bb數 你就會發現答案只有0,1,2共計三種。於是法一 模擬。答案對不對只會取決於第乙個是什麼。模擬兩邊就好了。includeusing namespace std int i,j,k,m,n,ans 2,a 10001 b 100...
省選專練ZJOI2005午餐
這是個好題 考察dp優化,dp,貪心,01揹包變種。好首先對吃飯時間從大到小排序,因為一隊人打飯時長總和一樣。dp i,j 表示前i個人,第一組用j的時間。放第乙個揹包 dp i j min max dp i 1 j a i w j a i v 放第二個揹包 dp i j min max dp i ...