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. 以查询方式实现1s定时

    以查询控制器的控制位状态来实现1s定时. #include <reg52.h> sbit LED = P0^; unsigned ; void main () { LED = ; // 点 ...

  2. Python 手册(一)

    Python 手册 Guido van Rossum Fred L. Drake,  Jr., editor PythonLabs Email: python-docs@python.org Rele ...

  3. Latex 常用知识点存档

    前言: 本篇仅作为自己的知识存档. $Latex$是什么,就不用介绍了,网上好多教程和知识点,当忘记的时候搜一下就可以了. 本科做美赛和毕设的时候用的$Latex$排版,最近开始在博客园写点东东,发现 ...

  4. spring mvc 配置

    之前配置spring mvc 怎么都访不到对应的jsp,后来把prefix里面的jsp改为views,就能访问到了,然后再改回jsp也可以访问到 搞了两天,都崩溃了,不管怎样先把没问题的例子给记录下来 ...

  5. 修改PHP上传大小设置

    目前文档文库上传大小是读取服务器的PHP环境的设置,你们的PHP环境上传限制是多少,这里显示的就是多少. 很多用户问我如何修改上传大小,自己可以百度一下方法,也可以根据以下步骤修改: 1.找到服务务器 ...

  6. 为什么 API 监控对于任何业务来说都重要?

    对于商务运算来说一个比较稳定的趋势在于对 API 日渐增长的依赖性,几乎每一个代码级交互过程都会调用 API 来收集数据或触发某些关键过程.没有 API ,你将无法与同伴进行文件交流,没有 API , ...

  7. 在ubuntu 10.04下编译ffmpeg

    最近准备研究ffmpeg-2.0.1. 那得先运行起来看看效果吧. 首先去官网下载源码: 然后 解压=> ./configure => make  OK . 1. 编译好后,发现没有ffp ...

  8. fzu 2037 Maximum Value Problem

    http://acm.fzu.edu.cn/problem.php?pid=2037 思路:找规律,找出递推公式f[n]=f[n-1]*n+(n-1)!,另一个的结果也是一个递推,s[n]=s[n-1 ...

  9. Android如何在一个线性布局里完美显示两个listview啊?

    复写一个listView ,在你布局文件中使用此view: <ScrollView android:layout_width="fill_parent" android:la ...

  10. html表格cell合并插件

    数据展示时需要合并部分数据自己写了一个简单插件 合并前: 合并后: 调用示例: var trs = $('table#dataList tbody tr').not('#demo').get(); v ...