Crazy Circuits HDU - 3157(有源汇有上下界最小流)
给出每条边的下界 求最小流
板题
提供两个板子代码 虽然这个题 第一个比较快
但在loj上https://loj.ac/problem/117
的板题 第一个1700+ms
第二个才600+ms 用输入挂后400+ms
- #include <iostream>
- #include <cstdio>
- #include <sstream>
- #include <cstring>
- #include <map>
- #include <cctype>
- #include <set>
- #include <vector>
- #include <stack>
- #include <queue>
- #include <algorithm>
- #include <cmath>
- #include <bitset>
- #define rap(i, a, n) for(int i=a; i<=n; i++)
- #define rep(i, a, n) for(int i=a; i<n; i++)
- #define lap(i, a, n) for(int i=n; i>=a; i--)
- #define lep(i, a, n) for(int i=n; i>a; i--)
- #define rd(a) scanf("%d", &a)
- #define rlld(a) scanf("%lld", &a)
- #define rc(a) scanf("%c", &a)
- #define rs(a) scanf("%s", a)
- #define rb(a) scanf("%lf", &a)
- #define rf(a) scanf("%f", &a)
- #define pd(a) printf("%d\n", a)
- #define plld(a) printf("%lld\n", a)
- #define pc(a) printf("%c\n", a)
- #define ps(a) printf("%s\n", a)
- #define MOD 2018
- #define LL long long
- #define ULL unsigned long long
- #define Pair pair<int, int>
- #define mem(a, b) memset(a, b, sizeof(a))
- #define _ ios_base::sync_with_stdio(0),cin.tie(0)
- //freopen("1.txt", "r", stdin);
- using namespace std;
- const int maxn = 1e5 + , INF = 0x7fffffff;
- int n, m, s, t;
- int head[maxn], cur[maxn], vis[maxn], nex[maxn << ], in[maxn];
- int d[maxn];
- int cnt;
- struct node
- {
- int u, v;
- int c;
- }Node[maxn << ];
- void add_(int u, int v, int c)
- {
- Node[cnt].u = u;
- Node[cnt].v = v;
- Node[cnt].c = c;
- nex[cnt] = head[u];
- head[u] = cnt++;
- }
- void add(int u, int v, int c)
- {
- add_(u, v, c);
- add_(v, u, );
- }
- bool bfs()
- {
- queue<int> Q;
- mem(d, );
- Q.push(s);
- d[s] = ;
- while(!Q.empty())
- {
- int u = Q.front(); Q.pop();
- for(int i = head[u]; i != -; i = nex[i])
- {
- int v = Node[i].v;
- if(!d[v] && Node[i].c > )
- {
- d[v] = d[u] + ;
- Q.push(v);
- if(v == t) return ;
- }
- }
- }
- return d[t] != ;
- }
- int dfs(int u, int cap)
- {
- int ret = ;
- if(u == t || cap == )
- return cap;
- for(int &i = cur[u]; i != -; i = nex[i])
- {
- int v = Node[i].v;
- if(d[v] == d[u] + && Node[i].c > )
- {
- int V = dfs(v, min(cap, Node[i].c));
- Node[i].c -= V;
- Node[i ^ ].c += V;
- ret += V;
- cap -= V;
- if(cap == ) break;
- }
- }
- if(cap > ) d[u] = -;
- return ret;
- }
- int Dinic()
- {
- int ans = ;
- while(bfs())
- {
- memcpy(cur, head, sizeof head);
- ans += dfs(s, INF);
- }
- return ans;
- }
- int tranf(string x)
- {
- if(x == "+") return ;
- if(x == "-") return n + ;
- int ans = , len = x.size();
- for(int i = ; i < len; i++)
- {
- ans += (x[i] - '') * pow(, len - i - );
- }
- return ans + ;
- }
- int main()
- {
- int w;
- string u, v;
- int u_, v_;
- while(~scanf("%d%d", &n, &m))
- {
- if(n == && m == ) break;
- mem(head, -);
- cnt = ;
- mem(in, );
- int sum = ;
- s = , t = n + ;
- rap(i, , m)
- {
- // scanf(" %c %c %d", &u, &v, &w);
- cin >> u >> v >> w;
- u_ = tranf(u);
- v_ = tranf(v);
- add(u_, v_, INF - w);
- in[v_] += w;
- in[u_] -= w;
- }
- for(int i = ; i <= n + ; i++)
- {
- if(in[i] > )
- {
- sum += in[i];
- add(s, i, in[i]);
- }
- else
- add(i, t, -in[i]);
- }
- int ans = Dinic();
- add(n + , , INF);
- ans += Dinic();
- if(sum == ans)
- cout << Node[head[(n + )] ^ ].c << endl;
- else
- cout << "impossible" << endl;
- }
- return ;
- }
- #include <iostream>
- #include <cstdio>
- #include <sstream>
- #include <cstring>
- #include <map>
- #include <cctype>
- #include <set>
- #include <vector>
- #include <stack>
- #include <queue>
- #include <algorithm>
- #include <cmath>
- #include <bitset>
- #define rap(i, a, n) for(int i=a; i<=n; i++)
- #define rep(i, a, n) for(int i=a; i<n; i++)
- #define lap(i, a, n) for(int i=n; i>=a; i--)
- #define lep(i, a, n) for(int i=n; i>a; i--)
- #define rd(a) scanf("%d", &a)
- #define rlld(a) scanf("%lld", &a)
- #define rc(a) scanf("%c", &a)
- #define rs(a) scanf("%s", a)
- #define rb(a) scanf("%lf", &a)
- #define rf(a) scanf("%f", &a)
- #define pd(a) printf("%d\n", a)
- #define plld(a) printf("%lld\n", a)
- #define pc(a) printf("%c\n", a)
- #define ps(a) printf("%s\n", a)
- #define MOD 2018
- #define LL long long
- #define ULL unsigned long long
- #define Pair pair<int, int>
- #define mem(a, b) memset(a, b, sizeof(a))
- #define _ ios_base::sync_with_stdio(0),cin.tie(0)
- //freopen("1.txt", "r", stdin);
- using namespace std;
- const int maxn = 1e5 + , INF = 0x7fffffff;
- int n, m, s, t;
- int head[maxn], cur[maxn], vis[maxn], nex[maxn << ], in[maxn];
- int d[maxn];
- int cnt;
- struct node
- {
- int u, v, bz;
- int c;
- }Node[maxn << ];
- void add_(int u, int v, int c, int bz)
- {
- Node[cnt].u = u;
- Node[cnt].v = v;
- Node[cnt].c = c;
- Node[cnt].bz = bz;
- nex[cnt] = head[u];
- head[u] = cnt++;
- }
- void add(int u, int v, int c, int bz)
- {
- add_(u, v, c, bz);
- add_(v, u, , bz);
- }
- bool bfs()
- {
- queue<int> Q;
- mem(d, );
- Q.push(s);
- d[s] = ;
- while(!Q.empty())
- {
- int u = Q.front(); Q.pop();
- for(int i = head[u]; i != -; i = nex[i])
- {
- int v = Node[i].v;
- if(!d[v] && Node[i].c > )
- {
- d[v] = d[u] + ;
- Q.push(v);
- if(v == t) return ;
- }
- }
- }
- return d[t] != ;
- }
- int dfs(int u, int cap)
- {
- int ret = ;
- if(u == t || cap == )
- return cap;
- for(int &i = cur[u]; i != -; i = nex[i])
- {
- int v = Node[i].v;
- if(d[v] == d[u] + && Node[i].c > )
- {
- int V = dfs(v, min(cap, Node[i].c));
- Node[i].c -= V;
- Node[i ^ ].c += V;
- ret += V;
- cap -= V;
- if(cap == ) break;
- }
- }
- if(cap > ) d[u] = -;
- return ret;
- }
- int Dinic()
- {
- int ans = ;
- while(bfs())
- {
- memcpy(cur, head, sizeof head);
- ans += dfs(s, INF);
- }
- return ans;
- }
- int tranf(string x)
- {
- if(x == "+") return ;
- if(x == "-") return n + ;
- int ans = , len = x.size();
- for(int i = ; i < len; i++)
- {
- ans += (x[i] - '') * pow(, len - i - );
- }
- return ans + ;
- }
- int main()
- {
- int w;
- string u, v;
- int u_, v_;
- while(~scanf("%d%d", &n, &m))
- {
- if(n == && m == ) break;
- mem(head, -);
- cnt = ;
- mem(in, );
- int sum = ;
- s = , t = n + ;
- rap(i, , m)
- {
- // scanf(" %c %c %d", &u, &v, &w);
- cin >> u >> v >> w;
- u_ = tranf(u);
- v_ = tranf(v);
- add(u_, v_, INF - w, );
- in[v_] += w;
- in[u_] -= w;
- }
- for(int i = ; i <= n + ; i++)
- {
- if(in[i] > )
- {
- sum += in[i];
- add(s, i, in[i], );
- }
- else
- add(i, t, -in[i], );
- }
- add(n + , , INF, );
- if(sum != Dinic())
- ps("impossible");
- else
- {
- sum = Node[head[n + ] ^ ].c;
- for(int i = ; i < cnt; i++)
- {
- if(!Node[i].bz) Node[i].v = ;
- }
- head[s] = head[t] = -;
- s = n + ;
- t = ;
- cout << sum - Dinic() << endl;
- }
- }
- return ;
- }
Crazy Circuits HDU - 3157(有源汇有上下界最小流)的更多相关文章
- loj #117. 有源汇有上下界最小流
题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...
- LOJ.117.[模板]有源汇有上下界最小流(Dinic)
题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...
- sgu 176 Flow construction(有源汇的上下界最小流)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11025 [模型] 有源汇点的上下界最小流.即既满足上下界又满足 ...
- Flow construction SGU - 176 有源汇有上下界最小流 二分法和回流法
/** 题目:Flow construction SGU - 176 链接:https://vjudge.net/problem/SGU-176 题意: 有源汇有上下界的最小流. 给定n个点,m个管道 ...
- 【 POJ - 3801】Crazy Circuits(有源汇、上下界最小流)
Description You’ve just built a circuit board for your new robot, and now you need to power it. Your ...
- sgu176 Flow Construction【有源汇有上下界最小流】
同样是模板题. 首先将有源汇转换为无源汇,假设原来的源汇为st,我们加入的源汇为ST,那么我们应该从t到s连一条流量为+∞的边,使原来的st满足收支平衡,退化为普通节点. 分离必要边和其他边,从S到T ...
- bzoj 2502 清理雪道(有源汇的上下界最小流)
[题意] 有一个DAG,要求每条边必须经过一次,求最少经过次数. [思路] 有上下界的最小流. 边的下界为1,上界为无穷.构造可行流模型,先不加ts边跑一遍最大流,然后加上t->s的inf边跑 ...
- LOJ117 有源汇有上下界最小流(上下界网络流)
跑出可行流后从原来的汇点向原来的源点跑最大流,原图最小流=inf-maxflow.显然超源超汇的相关边对其也没有影响.原图最小流=可行流-原图新增流量,因为t向s流量增加相当于s向t流量减少.但为什么 ...
- bzoj2502: 清理雪道(有源汇有上下界最小流)
传送门 别说话,自己看,我不会->这里 我这里用的建图方法是先跑一次最大流,连上$(t,s,inf)$之后再跑一遍,然后答案就是之前连的那条边的反向边的流量 据说还有种方法是连上$(t,s,in ...
随机推荐
- Ubuntu: 软件库(software repositories)
Linux 生态下,几乎每个发行版都有自己的软件库(software repositories),Ubuntu 当然也不例外.Ubuntu 提供了四个不同的软件库,分别是 main.restricte ...
- Php7 开发笔记
Ubuntu环境安装 http://www.jianshu.com/p/1d312d9f1be1 sudo apt-get install python-software-properties sof ...
- H5 21-属性选择器下
21-属性选择器下 --> <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- K 班1-7,alpha,beta 作业成绩汇总
K 班1-7,alpha,beta 作业成绩汇总 千帆竞发 详细得分 短学号 名 1 2 3 4 5 6 7 alpha beta TOTAL 505 基智 4.55 1 -2 0 0 -10 4.3 ...
- Python_动态参数、名称空间、作用域、作用域链、加载顺序、函数的嵌套、global、nonlocal
1.动态参数 当实参数量与形参数量相等时,参数传递正常. def func1(a, b, c): pass func1(1, 2, 3) 当实参数量与形参数量不相等时,则会报错. def func1( ...
- PhpStorm的注册激活方法
首先,需要修改本地的hosts文件(路径一般为C:\Windows\System32\drivers\etc\hosts),添加下面这行代码. 0.0.0.0 account.jetbrains.co ...
- java list 去重
Guava ImmutableSet源码去重处理,Hash处理 - 汪小哥 - CSDN博客 https://blog.csdn.net/u012881904/article/details/6895 ...
- oracle事务的四个特性(ACID)
事务产生的背景 当在PL/SQL中同时操作多个SQL语句,比如通过DML语句添加.修改或删除数据时,如何确保数据库数据不会因为意外而倒置错误数据是一个非常重要的问题. 以仓库发料系统为例,如果某一张领 ...
- Farm Irrigation
题目:Farm Irrigation 题目链接:http://210.34.193.66:8080/vj/Problem.jsp?pid=1494 题目思路:并查集 #include<stdio ...
- Day 3-4 函数进阶
1.名称空间 定义:Python使用叫做命名空间的东西来记录变量的轨迹.命名空间是一个 字典(dictionary) ,它的键就是变量名,它的值就是那些变量的值.是存放变量和值的内存地址的绑定关系的空 ...