随笔分类 - 网络流
摘要:http://poj.org/problem?id=3422 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int INF = 1q; 45 q.push(n*n*2); 46 vis[n*n*2] = true; 47 while(!q.empty()) 48 { 49 int u = q.front(); 50 vis[u] = false; 51 q.pop(); 52 ...
阅读全文
摘要:http://poj.org/problem?id=2195题意:在一个n*m的图中,'m'代表人,'H'代表房子,人每移动一次的费用为1,求所有人移动到房子里的最小花费。思路:最小费用最大流问题。关键是建图,建好图后就是MCMF的模板题了。。 关于建图:增加一个原点S,一个汇点T, S与所有人相连,容量为1,花费为0;每个人与所有房子相连,容量为1,花费为|人与房子的水平距离|+|人与房子的垂直距离|;最后所有的房子 与汇点相连,容量为1,花费为0。 关于算法:多次spfa找增广路,然后求最大流。最小花费+=原点到汇点的最小距离*每次增光后的最大流量 1 #i
阅读全文
摘要:http://poj.org/problem?id=2516题意:N位店主,M个供应商品的地方,每个地方能供应K种商品,不同地方的不同的商品供应给不同的店主有不同的花费,如果这些店主能被供应,输出最小的花费,否则输出-1.思路:N位店主: 用编号为0~n-1的点表示 M个供应商品的地方:用编号为 m~m+n-1的点表示 m+n 代表超级源点,m+n+1 代表终极汇点 用这些点建图,求最小费用最大流 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int maxn=120; ...
阅读全文
摘要:求最小点覆盖数,即最大匹配数,匈牙利算法。 1 #include 2 #include 3 int map[505][505],vis[505],linker[505];//linker[]记录V2中的点i在V1中所匹配的点x的编号 4 int n,k; 5 int dfs(int x) 6 { 7 for (int i = 1; i <= n; i++) 8 { 9 if (map[x][i] && !vis[i])//x到i有边且i点未被标记10 {11 vis[i] = 1;12 if (!...
阅读全文
摘要:计算最大流,EK算法模板题。 1 #include 2 #include 3 #include 4 using namespace std; 5 const int maxn=520; 6 const int maxm=100010; 7 const int INF=1q;34 max_flow = 0;35 for (;;)36 {37 memset(a,0,sizeof(a));38 q.push(s);39 a[s] = INF;//源点容量为无穷40 while(!q.empty())41 ...
阅读全文
摘要:http://poj.org/problem?id=1459题意:有一个电路网络,每个节点可以产生、传递、消耗若干电量,有点线连接结点,每个电线有最大传输量,求这个网络的最大消费量。思路:从源点到发电站连边,流量为发电量,从用户到汇点连边,流量为消费量,再根据电线连双向边,求最大流即可。 1 #include 2 #include 3 #include 4 const int N=220; 5 const int INF=1q;14 memset(pre,-1,sizeof(pre));15 pre[s] = 0;16 int k;17 q.push(s);18...
阅读全文