http://codeforces.com/problemset/problem/269/C

题目大意:

给定一个边没有定向的无法增广的残量网络且1是源点,n是汇点,给定每条边中的流。 

让你把所有边定向的同时保证这是一个合法的无法增广的无环残量网络(n,m <=2*10^5)

题解:

这道题首先从流量守恒的角度入手

我们知道对于每个中间点来说一定满足流量守恒性质(流入量 == 流出量)

而我们又可以对所有相连的边权加和求得所有(流入它)的和(流出的它的)流量之和

所以我们可以直接把相连的边的权值之和加起来除以2,这样就可以算出来它的流入量

相应的,我们就知道了它的流出量 

但是我们知道了所有边的流入流出量有什么用呢?

如果我们知道了一个点的所有的流入量,那我们是不是就可以知道剩下的边一定是向外的呢?

答案是肯定的 

这时候我们想,要是每次我们都至少有一个点的流入都已知

那我就可以通过剩下的边都流向外面的方式去更新剩余的节点的流入量了

这种好事有没有呢?

有!并且这样的点在每次更新完后一定至少存在一个! 

所以我们直接使用类似于拓扑排序的过程来解决这道题就可以了!!!!

下面来证明这样的点一定存在:

假设在几次更新后(第一次一定存在,即源点1),不存在一个流入量已知的点,设其为u  

那么我们知道,一定存在一条流  <x,u>是我们没有成功定向的,所以说x也没有定向!

这样我们无限向前迭代,会出现两种情况  

1.我们无限迭代后,回到了源点(x = 1)。  

  这种情况下,我们知道如果x = 1那么一定知道流<x,u>已经定向方向,矛盾,不成立.

2.我们无限迭代,一直处在一个循环里。  

  这种情况不可能发生。因为流网络中不可能存在环。所以这种情况也不成立    

所以两种情况都不成立,故不存在这样的点u  

所以,至少存在一个可更新的点,证明完毕

Code

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=*x+ch-'',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = ;
struct Edge{
int to,next,flow;
bool flag;
}G[maxn<<];
int head[maxn],cnt=;
inline void add(int u,int v,int c){
G[++cnt].to = v;
G[cnt].next = head[u];
G[cnt].flow = c;
head[u] = cnt;
}
int q[maxn],l,r,flow[maxn],n;
#define v G[i].to
inline void bfs(){
l = ;r = -;q[++r] = ;
while(l <= r){
int u = q[l++];
for(int i = head[u];i;i=G[i].next){
if(G[i].flag || G[i^].flag) continue;
G[i].flag = true;
flow[v] -= G[i].flow;
if(flow[v] == && v != n) q[++r] = v;
}
}
}
#undef v
int main(){
int m;read(n);read(m);
for(int i=,u,v,d;i<=m;++i){
read(u);read(v);read(d);
add(u,v,d);add(v,u,d);
flow[u] += d;flow[v] += d;
}
for(int i=;i<=n;++i) flow[i] >>= ;
bfs();
for(int i=;i<=cnt;i+=){
printf("%d\n",G[i^].flag);
}
getchar();getchar();
return ;
}

CodeForces - 269C Flawed Flow的更多相关文章

  1. codeforces 269C Flawed Flow(网络流)

    Emuskald considers himself a master of flow algorithms. Now he has completed his most ingenious prog ...

  2. Codeforces 269C Flawed Flow (看题解)

    我好菜啊啊啊.. 循环以下操作 1.从队列中取出一个顶点, 把哪些没有用过的边全部用当前方向. 2.看有没有点的入度和 == 出度和, 如果有将当前的点加入队列. 现在有一个问题就是, 有没有可能队列 ...

  3. Codeforces 270E Flawed Flow 网络流问题

    题意:给出一些边,给出边的容量.让你为所有边确定一个方向使得流量最大. 题目不用求最大流, 而是求每条边的流向,这题是考察网络流的基本规律. 若某图有最大,则有与源点相连的边必然都是流出的,与汇点相连 ...

  4. 网络流相关(拓扑)CodeForces 269C:Flawed Flow

    Emuskald considers himself a master of flow algorithms. Now he has completed his most ingenious prog ...

  5. @codeforces - 708D@ Incorrect Flow

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个有源点与汇点的图 G,并对于每一条边 (u, v) 给定 ...

  6. Codeforces Round #165 (Div. 2)

    C. Magical Boxes 问题相当于求\[2^p \gt \max{a_i \cdot 2^{k_i}},p \gt k_i\] D. Greenhouse Effect \(dp(i,j)\ ...

  7. Educational Codeforces Round 45 (Rated for Div. 2) F - Flow Control

    F - Flow Control 给你一个有向图,要求你给每条边设置流量,使得所有点的流量符合题目给出的要求. 思路:只有在所有点的流量和为0时有解,因为增加一条边的值不会改变所有点的总流量和, 所以 ...

  8. Codeforces 717G Underfail(最小费用最大流 + AC自动机)

    题目 Source http://codeforces.com/problemset/problem/717/G Description You have recently fallen throug ...

  9. 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)

    A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...

随机推荐

  1. 让你的 Node.js 应用跑得更快的 10 个技巧

    Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...

  2. ng表单验证,提交以后才显示错误

    只在提交表单后显示错误信息 有时候不想在用户正在输入的时候显示错误信息. 当前错误信息会在用户输入表单时立即显示. 由于Angular很棒的数据绑定特性,这是可以发生的. 因为所有的事务都可以在一瞬间 ...

  3. 自己实现的库函数2(memset,memcmp,memcpy,memmove)

    memset,memcmp,memcpy,memmove是对内存进行管理的库函数,为了更好的理解和使用这几个函数,自己用C语言实现一下~ //内存设置函数void* my_memset(void* d ...

  4. WARNING L15: MULTIPLE CALL TO SEGMENT

    原网页:http://www.cnblogs.com/CuriosityWzk/archive/2011/12/25/2301090.html WARNING L15: MULTIPLE CALL T ...

  5. AppStore 审核中文版 --- 程序员必看

    App Store审核指南中文版(2014.10.11更新) 2014-11-03 程序猿 苹果在9月3日对App Store审核指南进行了重大更新,新添加了扩展.HealthKit.HomeKit以 ...

  6. leetcode第三题Longest Substring Without Repeating Characters java

    Longest Substring Without Repeating Characters Given a string, find the length of the longest substr ...

  7. [HDOJ 5212] [BestCoder Round#39] Code 【0.0】

    题目链接:HDOJ - 5212 题目分析 首先的思路是,考虑每个数对最终答案的贡献. 那么我们就要求出:对于每个数,以它为 gcd 的数对有多少对. 显然,对于一个数 x ,以它为 gcd 的两个数 ...

  8. nojs iis asp.net mvc

    http://blogs.msdn.com/b/scott_hanselman/archive/2011/11/29/window-iis-node-js.aspx http://www.hansel ...

  9. Highcharts Pie 饼图提示标签IE下重叠解决方法,及json数据绑定方法

    一.提示标签重叠解决方法: series: [{ startAngle:90,//添加这个属性,就可以解决 type: 'pie', name: '充值方式' }] 不知道为什么,上述方法不行了.第一 ...

  10. poj1436 Horizontally Visible Segments

    这是一个区间更新的题目,先将区间放大两倍,至于为什么要放大可以这样解释,按照从左到右有4个区间,y值是[1,5],[1,2],[3,4],[1,4]如果不放大的话,查询[1,4]区间和前面区间的”可见 ...