1. 程式人生 > >bzoj千題計劃322:bzoj2561: 最小生成樹(最小割)

bzoj千題計劃322:bzoj2561: 最小生成樹(最小割)

#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
 
using namespace std;
 
#define N 20001
#define M 200001
 
int n,m;
 
int tot;
int src,decc;
int front[N],to[M<<1],nxt[M<<1],cap[M<<1];
 
int lev[N],cur[N];
queue
<int>q; struct node { int u,v,l; }e[M]; void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } bool bfs() { for(int i=0;i<=n;++i) cur[i]=front[i],lev[i]=-1; while(!q.empty()) q.pop(); q.push(src); lev[src]
=0; int now,t; while(!q.empty()) { now=q.front(); q.pop(); for(int i=front[now];i;i=nxt[i]) { t=to[i]; if(lev[t]==-1 && cap[i]) { lev[t]=lev[now]+1
; if(t==decc) return true; q.push(t); } } } return false; } int dinic(int now,int flow) { if(now==decc) return flow; int rest=0,delta; for(int &i=cur[now];i;i=nxt[i]) if(cap[i] && lev[to[i]]==lev[now]+1) { delta=dinic(to[i],min(flow-rest,cap[i])); if(delta) { rest+=delta; cap[i]-=delta; cap[i^1]+=delta; if(rest==flow) break; } } if(rest!=flow) lev[now]=-1; return rest; } bool cmp1(node p,node q) { return p.l<q.l; } bool cmp2(node p,node q) { return p.l>q.l; } void add(int u,int v,int w) { to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; cap[tot]=w; to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; cap[tot]=w; } int main() { read(n); read(m); for(int i=1;i<=m;++i) read(e[i].u),read(e[i].v),read(e[i].l); read(src); read(decc); int L; read(L); int ans=0; tot=1; sort(e+1,e+m+1,cmp1); for(int i=1;i<=m;++i) if(e[i].l>=L) break; else add(e[i].u,e[i].v,1); while(bfs()) ans+=dinic(src,2e9); memset(front,0,sizeof(front)); tot=1; sort(e+1,e+m+1,cmp2); for(int i=1;i<=m;++i) if(e[i].l<=L) break; else add(e[i].u,e[i].v,1); while(bfs()) ans+=dinic(src,2e9); printf("%d",ans); }

相關推薦

bzoj計劃322bzoj2561: 小生成樹

#include<cstdio> #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std;

bzoj計劃309bzoj4332: JSOI2012 分零食分治+FFT

#include<cmath> #include<cstdio> #include<algorithm> using namespace std; const int M=1<<17; #define N 10001 int m,

bzoj計劃312bzoj2119: 股市的預測字尾陣列+st表

#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #d

bzoj計劃318bzoj1396: 識別子串字尾自動機 + 線段樹

#include<cstdio> #include<cstring> #include<algorithm> #define N 100001 using namespace std; char s[N]; int ch[N<&

bzoj計劃316bzoj3173: [Tjoi2013]長上升子序列二分+樹狀陣列

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 100001 #define lowbit(x) x&-x

bzoj計劃311bzoj5017: [Snoi2017]炸彈線段樹優化tarjan構圖

#include<cstdio> #include<vector> #include<iostream> #include<algorithm> using namespace std; const int mod=1e9+7;

bzoj計劃319bzoj2865: 字串識別字尾自動機 + 線段樹

#include<map> #include<cstdio> #include<cstring> #include<algorithm> #define N 500001 using namespace std; char s[

bzoj計劃310bzoj5285: [Hnoi2018]尋寶遊戲(思維+雜湊)

#include<cstdio> #include<algorithm> #define N 5001 using namespace std; const int mod=1e9+7; int bit[N]; char s[N]; int has

bzoj計劃321bzoj5251: [2018多省省隊聯測]劈配網路流 + 二分

#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #d

bzoj計劃317bzoj4650: [Noi2016]優秀的拆分字尾陣列+差分

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 30002 using namespace std; int n;

bzoj計劃323bzoj1951: [Sdoi2010]古代豬文Lucas+CRT+尤拉定理

#include<cmath> #include<cstdio> #include<iostream> using namespace std; const int mod=999911659; const int phi=mod-1; typ

bzoj計劃324bzoj5249: [2018多省省隊聯測]IIIDX線段樹

#include<cmath> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 500001 int d[N

bzoj計劃313bzoj3879: SvT字尾陣列+st表+單調棧

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 500001 #define M 3000001 int n,m,mm;

bzoj計劃314bzoj3238: [Ahoi2013]差異字尾陣列+st表+單調棧

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 500001 int n

bzoj計劃320bzoj4939: [Ynoi2016]掉進兔子洞莫隊 + bitset

#include<cmath> #include<cstdio> #include<bitset> #include<cstring> #include<iostream> #include<algorithm> us

bzoj計劃308bzoj4589: Hard Nim倍增FWT+生成函式

#include<cstdio> #include<cstring> using namespace std; #define N 50001 const int mod=1e9+7; const int M=1<<16; int inv

bzoj計劃315bzoj3172: [Tjoi2013]單詞AC自動機

#include<queue> #include<cstdio> #include<cstring> using namespace std; #define N 2000001 using namespace std; int pos[20

BZOJ 2561 小生成樹

任重而道遠  給定一個邊帶正權的連通無向圖G=(V,E),其中N=|V|,M=|E|,N個點從1到N依次編號,給定三個正整數u,v,和L (u≠v),假設現在加入一條邊權為L的邊(u,v),那麼需要刪掉最少多少條邊,才能夠使得這條邊既可能出現在最小生成樹上,也可能出現在最大生成樹上? Inp

【圖】小生成樹成本Prim演算法

最小成本:n 個頂點,用 n−1 條邊把一個連通圖連線起來,並且使得權值的和最小。 最小生成樹:構造連通網的最小代價生成樹。 根據原來寫的部落格:【圖】圖的定義,裡面提到一個連通圖的生成樹是一

【圖】小生成樹成本克魯斯卡爾Kruskal演算法

給出一個連通網: 克魯斯卡爾(Kruskal)演算法 基本思想 假設 N=(V,{E}) 是連通網: 令最小生成樹的初始狀態為只有 n 個頂點並且沒有邊的非連通圖 T={V,{}}