網路流雜談

2022-06-04 15:21:09 字數 4315 閱讀 1498

快要省選了,現在啥也不會的菜雞最後的掙扎

這個星期給自己的任務是搞懂網路流

這個星期的東西都更在這個貼裡了

一:[scoi2007]蜥蜴

[scoi2007]蜥蜴

思路:考慮建圖,主要是將乙個點拆成兩個點,入點和出點間連邊,這條邊的權值可以限制這條邊的走的次數

**:

#include#include#include#include#include#define ll long long

int r,c,d;

int h[50][50],f[50][50];

int head[100000];

struct pe[100000];

int s,t;

int cnt = -1;

void add(ll x,ll y,ll v)

double get(ll x1,ll y1,ll x2,ll y2)

int sum;

int vis[10000];

bool bfs()

} }return vis[t] != -1;

}int dfs(int u,int flow)

} if(!used)vis[u] = -1;

return used;

}int dinic()

int main()

if(a == 'l')

f[i][j] = 1;

} int now = 0;

for(int i = 1;i <= r;++i)

for(int j = 1;j <= c;++j)

if(f[i][j])

if((i <= d || i >= r - d + 1) && h[i][j])else

if((j <= d || j >= c - d + 1 )&& h[i][j])

} for(int i = 1;i <= r;++i)

for(int j = 1;j <= c;++j)

for(int p = 1;p <= r;++p)

for(int q = 1;q <= c;++q)

} std::cout《二: [icpc-beijing 2006]狼抓兔子

[icpc-beijing 2006]狼抓兔子

思路:說起來還是蠻有感觸的

想當年第一次開啟\(bzoj\)看到的就是這個題,當時什麼也不會就搜了題解,不過什麼也沒看懂

當時那個懵懂的人,現在卻在為省選準備啊

很明顯是最小割,不過也有平面圖對偶圖最短路路的做法

平面圖對偶圖:

如果乙個圖是 \(g\) 平面圖,那麼其存在乙個對偶圖 \(g′\) ,構造方法為將原圖中的每個面替換成點,點替換為面,新的邊與原來的邊分別相交。

那麼此時有,原圖的最大流 = 最小割 = 對偶圖最短路。

**:#include#include#include#include#define ll long long

int n,m;

int id(int x,int y)

int head[1000005];

struct pe[6000005];

int s,t;

int cnt = 1;

void add(ll x,ll y,ll v)

int sum;

int vis[1000005];

bool bfs()

} }return vis[t] != -1;

}int dfs(int u,int flow)

} if(!used)vis[u] = -1;

return used;

}int dinic()

int main()

for(int i = 1;i <= n - 1;++i)

for(int j = 1;j <= m;++j)

for(int i = 1;i <= n - 1;++i)

for(int j = 1;j <= m - 1;++j)

std::cout《把最開始的ff演算法的\(bfs\)部分改為\(spfa\),同時記錄字首邊,方便進行資料更新(基於\(dinic\)的最小費用流演算法過幾天再寫)

**#include#include#include#define ll long long

int n,m,s,t;

struct pe[100005];

int head[5005],minw[5005],minc[5005],pre[5005];

bool vis[5005];

int cnt = 1;

void add(int x,int y,int w,int c)

bool spfa()

qwq.push(s);

vis[s] = 1;

minw[s] = 0x3f3f3f3f;

minc[s] = 0;

while(!qwq.empty())

}} }

return minc[t] != 0x3f3f3f3f;

}int answ,ansc;

void up()

}int main()

while(spfa())

up();

std::cout《一: [sdoi2013]費用流

[sdoi2013]費用流

還是一樣拆點來滿足題目要求的次數限制,在拆開的兩點間的費用應為\(0\)

**#include#include#include#define ll long long

int n,m,s,t;

struct pe[100005];

int head[5005],minw[5005],minc[5005],pre[5005];

bool vis[5005];

int cnt = 1;

void add(int x,int y,int w,int c)

bool spfa()

qwq.push(s);

vis[s] = 1;

minc[s] = 0;

minw[s] = 0x3f3f3f3f;

while(!qwq.empty())

}} }

return minc[t] != 0x3f3f3f3f;

}int answ,ansc;

void up()

}int main()

for(int i = 1;i <= m;++i)

while(spfa())

up();

std::cout《文理分科

一種典型的二選一的題目,可以將兩個選擇設為\(s,t\),然後分別連邊,然後求最小割

對於題目中所說的集體選課多權值的情況,可以虛構\((i,j)'\)然後以\(ss[i][j]為權在他和s之間連邊\),然後以\(inf\)在\((i,j)自己和周圍五個點連邊\),這步\(inf\)是為了防止這條邊被割掉

然後求最小割,用全部的權值和減去最大流即可

#include#include#include#define ll long long

ll n,m;

ll a[200][200],s1[200][200],sa[200][200],ss[200][200];

int id(int x,int y)

struct pe[500000];

ll cnt = 1,head[500000];

ll s,t;

void add(ll x,ll y,ll v)

ll sum = 0;

ll vis[500000];

ll pcnt;

std::queueqwq;

bool bfs()

} }return vis[t] != -1;

}ll dfs(ll now,ll flow)

} if(!used)vis[now] = -1;

return used;

}ll dinic()

int main()

pcnt = n * m + 1;

for(int i = 1;i <= n;++i)

for(int j = 1;j <= m;++j)

if(j + 1 <= m)

if(i - 1 > 0)

if(j - 1 > 0)

} for(int i = 1;i <= n;++i)

for(int j = 1;j <= m;++j)

if(j + 1 <= m)

if(i - 1 > 0)

if(j - 1 > 0)

} std::cout<}

工作流技術雜談

工作流 在互連網上越來越流行了,我們隨便在 google 工作流到底是什麼呢,對於從事做計算機軟體設計的人而言,它是一項技術 是我們為我們的客戶提供解決方案框架的一部分 對於從事企業資訊化管理的人而言,它是一種思想,是我們降低使用者的it運維成本的一種方法 對於從事軟體開發的人而言,它是一項技術,是...

Windows網路程式設計雜談

windows網路程式設計雜談 關於bind inaddr any 的具體含義是,繫結到0.0.0.0。此時,對所有的位址都將是有效的,如果系統考慮冗餘,採用多個網絡卡的話,那麼使用此種bind,將在所有網絡卡上進行繫結。在這種情況下,你可以收到傳送到所有有效位址上資料報。例如 sockaddr i...

工作流技術雜談 2008

工作流技術雜談 2008 2007 年在工作流技術雜談部落格上這麼寫到 工作流已經成為了乙個事實存在的概念和名詞,可是到了 2007 年依然找不到沒有能夠明確的定義,在互連網上,我們隨便在 google 工作流到底是什麼呢,對於從事做計算機軟體設計的人而言,它是一項技術 是我們為我們的客戶提供解決方...