bzoj 1797 最小割【最小割】【tarjan】
2016-06-28 13:20
330 查看
题目大意:给定一张图,对于每条边,询问 1:是否存在于某个最小割集中,2:是否存在于所有最小割集中
对残余网络做一次 tarjan
对于一条满流边,若 id[s] != id[t],则能存在于某个最小割集中
若又有 id[s] == id[S] && id[t] == id[T] 则一定能存在于最小割集中
对残余网络做一次 tarjan
对于一条满流边,若 id[s] != id[t],则能存在于某个最小割集中
若又有 id[s] == id[S] && id[t] == id[T] 则一定能存在于最小割集中
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #define INF 1000000000 #define N 4010 #define M 120500 using namespace std; int n,m,siz = 1,S,T,tot,cnt,top; int d ,p ,dfn ,low ,st ,id ; int first ,next[M],to[M],len[M]; bool v ; void inser(int x,int y,int w) { next[++ siz] = first[x]; first[x] = siz; to[siz] = y; len[siz] = w; } void add_edge(int x,int y,int w) { inser(x,y,w),inser(y,x,0); } bool bfs() { int head = 0,tail = 1; memset(d,0,sizeof(d)); d[p[1] = S] = 1; while (head ^ tail) { int x = p[++ head]; for (int i = first[x];i;i = next[i]) if (!d[to[i]] && len[i]) d[p[++ tail] = to[i]] = d[x] + 1; } return d[T]; } int dfs(int x,int flow) { if (x == T) return flow; int ret = 0; for (int i = first[x];i && flow;i = next[i]) if (d[to[i]] == d[x] + 1 && len[i]) { int w = dfs(to[i],min(flow,len[i])); len[i] -= w,len[i ^ 1] += w; flow -= w,ret += w; } if (!ret) d[x] = 0; return ret; } int dinic() { int ret = 0; while (bfs()) ret += dfs(S,INF); return ret; } void dfs(int x) { dfn[x] = low[x] = ++ cnt; st[++ top] = x; v[x] = true; for (int i = first[x];i;i = next[i]) if (len[i]) { if (!dfn[to[i]]) dfs(to[i]),low[x] = min(low[x],low[to[i]]); else if (v[to[i]]) low[x] = min(low[x],low[to[i]]); } if (dfn[x] == low[x]) { tot ++; while (st[top] ^ x) id[st[top]] = tot,v[st[top --]] = false; id[st[top]] = tot,v[st[top --]] = false; } } int main() { scanf("%d%d%d%d",&n,&m,&S,&T); for (int x,y,w,i = 1;i <= m;i ++) scanf("%d%d%d",&x,&y,&w),add_edge(x,y,w); dinic(); for (int i = 1;i <= n;i ++) if (!dfn[i]) dfs(i); for (int i = 2;i <= siz;i += 2) { int x = to[i ^ 1],y = to[i]; printf("%d ",(id[x] != id[y] && !len[i]) ? 1 : 0); printf("%d\n",(id[x] != id[y] && !len[i] && id[x] == id[S] && id[y] == id[T]) ? 1 : 0); } return 0; }
相关文章推荐
- Android 软键盘属性
- PHP计算文件夹大小
- 如何在宿主机上查看kvm虚拟机的IP
- Python enumerate()功能
- Myeclipse/eclipse 安装查看class文件的插件
- 数据库权限管理
- 数据库FMDB详解
- mysql case when
- CString成员函数详解[转]
- 几张图看懂列式存储
- Error:(303, 27) 错误: 找不到符号 符号: 方法 sin(float) 位置: 类 FloatMath
- MySQL添加新用户 出现mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
- JavaScript数据结构之集合
- java 实现WebService 以及不同的调用方式
- javaweb学习总结(十九)——JSP标签
- cmake用法和注意
- 专题四 Problem L
- jQuery网络请求及JSON数据处理
- HDOJ 1817 Necklace of Beads
- Bazel C++ 基础[翻译]