快要省選了,現在啥也不會的菜雞最後的掙扎
這個星期給自己的任務是搞懂網路流
這個星期的東西都更在這個貼裡了
一:[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 工作流到底是什麼呢,對於從事做計算機軟體設計的人而言,它是一項技術 是我們為我們的客戶提供解決方...