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. 『奇葩问题集锦』Fedora ubuntu 下使用gulp 报错 Error: watch ENOSPC 解决方案

    用gulp启动,错误如下 Error: watch ENOSPC at exports._errnoException (util.js:746:11) at FSWatcher.start (fs. ...

  2. canvas径向渐变详解

    创建径向渐变步骤如下: 1,创建径向渐变对象 createRadialGradient(x0,y0,r0,x1,y1,r1),其中x0,y0,r0分别为起始圆的位置坐标和半径,x1,y1,r1为终止圆 ...

  3. DOS命令中出现空格问题

    1.DOS命令中路径出现空格时如何处理? 在DOS命令中,如果路径中出现空格,可能为报错:如参数错误 如:  xcopy C:\ABC CD\txt.txt C:\ ,   由于路径中包含空格,执行后 ...

  4. wamp的mysql密码修改

    ==方法1== 通过WAMP打开mysql控制台,提示输入密码,因为现在是空,所以直接按回车. 输入“use mysql”,意思是使用mysql这个数据库教程,提示“Database changed” ...

  5. google+ 登录API 使用 javascript sdk 快速入门 (图解)

    准备工作: 打开Google API 控制台 : https://code.google.com/apis/console 点击 My Project (我的项目) 按照图示流程,您将完成一个goog ...

  6. MySQL - “Timeout error occurred trying to start MySQL Daemon”解决方法

    前几天,网站出现Many connections的问题,进入mysql,show full processlist发现有154个进程,晕....直接service mysqld restart 但是不 ...

  7. 网络ip

    国际规定:把所有的IP地址划分为 A,B,C,D,E A类地址:范围从0-127,0是保留的并且表示所有IP地址,而127也是保留的地址,并且是用于测试环回用的.因此 A类地址的范围其实是从1-126 ...

  8. Python的面向对象1

    今天,我们来介绍Python的面向对象编程,其实面向对象并不陌生,在C++  ,Java  ,PHP中也有大量使用! 好了,我们来步入正题! 那什么是面向对象编程呢? 1. 面向对象编程是一种程序设计 ...

  9. Linux文件3个时间点(access time,modify time,change time)

    在Linux中使用stat命令来查看文件的详细信息. 如图所示,会出现3个类型的时间,分别是Access,Modify,Change. access time:表示最后一次访问(仅仅是访问,没有改动) ...

  10. vs2010 未能正确加载方案中的一个或多个项目

    Visual studio在打开解决方案时,往往会碰到一个这样的错误,提示说:未能正确加载方案中的一个或多个项目: 我们可以通过以下步骤来解决该问题:首先,在相应的sln类型文件上点击右键,选择用记事 ...