求完网络流以后 tarjan一发 判一判

//By SiriusRen
#include <queue>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 122222
int n,m,s,t;
struct Node{int x,y,w,r;}node[N];
struct Dinic{
int first[N],next[N],v[N],w[N],tot,vis[10050];
int low[N],dfn[N],in[N],stk[N],cnt,top,T,jy,p[N];
void init(){memset(first,-1,sizeof(first));}
void add(int x,int y,int z){Add(x,y,z),Add(y,x,0);}
void Add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
bool tell(){
queue<int>q;q.push(s);
memset(vis,-1,sizeof(vis)),vis[s]=0;
while(!q.empty()){
int tp=q.front();q.pop();
for(int i=first[tp];~i;i=next[i])
if(vis[v[i]]==-1&&w[i])
vis[v[i]]=vis[tp]+1,q.push(v[i]);
}
return vis[t]!=-1;
}
int zeng(int x,int y){
if(x==t)return y;
int r=0;
for(int i=first[x];~i&&y>r;i=next[i])
if(vis[v[i]]==vis[x]+1&&w[i]){
int t=zeng(v[i],min(y-r,w[i]));
w[i]-=t,w[i^1]+=t,r+=t;
}
if(!r)vis[x]=-1;
return r;
}
void flow(){while(tell())while(zeng(s,0x3fffffff));}
void tarjan(int x){
dfn[x]=low[x]=++cnt,in[x]=1,stk[++top]=x;
for(int i=first[x];~i;i=next[i])
if(w[i]){
if(!dfn[v[i]])tarjan(v[i]),low[x]=min(low[x],low[v[i]]);
else if(in[v[i]])low[x]=min(low[x],dfn[v[i]]);
}
if(low[x]==dfn[x]){T++;do{jy=stk[top--],p[jy]=T,in[jy]=0;}while(jy!=x);}
}
void solve(){
flow();
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=m;i++){
if(!w[i*2-2]&&p[node[i].x]==p[s]&&p[node[i].y]==p[t])node[i].w=2;
else if(p[node[i].x]!=p[node[i].y]&&!w[i*2-2])node[i].w=1;
else node[i].w=0;
}
for(int i=1;i<=m;i++){
if(node[i].w==2)puts("1 1");
else if(node[i].w==1)puts("1 0");
else puts("0 0");
}
}
}dinic;
int main(){
dinic.init();
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].w);
dinic.add(node[i].x,node[i].y,node[i].w);
}
dinic.solve();
}

最新文章

  1. Hibernate-模板模式
  2. sudo: no tty present and no askpass program specified(转)
  3. iOS阶段学习第31天笔记(UINavigationBar介绍)
  4. 快速排序(python版)
  5. make自动生成依赖文件的两种形式
  6. 2016/10/28 很久没更了 leetcode解题 3sumcloset
  7. 前端资讯周报 3.13 - 3.19: WebVR来了!以及如何优化scroll事件性能
  8. Spring-quartz 可传参(包括service注入)任务调度 多个任务调度
  9. 深入浅出HTTP协议
  10. 【IT笔试面试题整理】字符串的排列
  11. Python2.7-bisect
  12. 使用Python实时获取cmd的输出
  13. TileMap地图
  14. 分享五:php数组操作
  15. SPOJ BALNUM Balanced Numbers(数位DP+状态压缩)题解
  16. 统计oracle表中字段的个数
  17. setTimeout和setInterval的unref()和ref()用法
  18. Leetcode 之Evaluate Reverse Polish Notation(41)
  19. html常用的小技能
  20. 后台管理微服务(二)——docker的使用

热门文章

  1. linux openssl加密文件
  2. 输入password登录到主界面,录入学生编号,排序后输出
  3. [linux]shell中,反引號(`)的应用
  4. ES线程池设置
  5. JSP中动态include与静态include的区别介绍
  6. Android之通过HttpURLConnection.getResponseCode状态码抛出异常的问题以及解决方法
  7. python下载网页转化成pdf
  8. 使用IDEA在Maven中创建MyBatis逆向工程以及需要注意的问题(入门)
  9. java开发过程中几种常用算法
  10. 洛谷P2766 最长不下降子序列问题 网络流_DP