CodeForces - 269C Flawed Flow
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的更多相关文章
- codeforces 269C Flawed Flow(网络流)
Emuskald considers himself a master of flow algorithms. Now he has completed his most ingenious prog ...
- Codeforces 269C Flawed Flow (看题解)
我好菜啊啊啊.. 循环以下操作 1.从队列中取出一个顶点, 把哪些没有用过的边全部用当前方向. 2.看有没有点的入度和 == 出度和, 如果有将当前的点加入队列. 现在有一个问题就是, 有没有可能队列 ...
- Codeforces 270E Flawed Flow 网络流问题
题意:给出一些边,给出边的容量.让你为所有边确定一个方向使得流量最大. 题目不用求最大流, 而是求每条边的流向,这题是考察网络流的基本规律. 若某图有最大,则有与源点相连的边必然都是流出的,与汇点相连 ...
- 网络流相关(拓扑)CodeForces 269C:Flawed Flow
Emuskald considers himself a master of flow algorithms. Now he has completed his most ingenious prog ...
- @codeforces - 708D@ Incorrect Flow
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个有源点与汇点的图 G,并对于每一条边 (u, v) 给定 ...
- 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)\ ...
- Educational Codeforces Round 45 (Rated for Div. 2) F - Flow Control
F - Flow Control 给你一个有向图,要求你给每条边设置流量,使得所有点的流量符合题目给出的要求. 思路:只有在所有点的流量和为0时有解,因为增加一条边的值不会改变所有点的总流量和, 所以 ...
- Codeforces 717G Underfail(最小费用最大流 + AC自动机)
题目 Source http://codeforces.com/problemset/problem/717/G Description You have recently fallen throug ...
- 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)
A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...
随机推荐
- 小笔记(一):ajax传递数组及将ajax返回数据赋值
当使用ajax传递数据时,有可能传递多个数据,这是使用以下方法传递数据就会显得数据过多且混杂 $.ajax({ type:'post', url:url, data:{data:data,conten ...
- 批量执行sql语句
基本使用 $sqls="sql语句1;sql语句2;sql语句n"; 或 $sqls="insert into xx;"; $sqls.="inse ...
- OS概论2
实时系统 实时即表示及时,实时计算可以定义为这样一类计算:系统的正确性,不仅由计算的逻辑结果来确定,而且还取决于产生结果的时间.事实上,实时系统最主要的特征,是将时间作为关键参数,它必须对所接收到的某 ...
- python使用sqlite3
import sqlite3 mysqldb=sqlite3.connect(r"C:\Users\Administrator\Desktop\testdb.db") mysqld ...
- Docker系列
Docker学习系列(五):Dockerfile文件 什么是Dockerfile? 它是一个名称为Dockerfile的文件 它是一个脚本文件,由一系列命令和参数构成 Dockerfile是自动构建d ...
- 根据WSDL生成代理类方式
方式一: 1.使用VS2010提供的工具wsdl.exe由WSDL文件生成cs文件 使用wsdl.exe的/serverInterface选项(或缩写的 /si)指定输入的wsdl文件(注意,如果要转 ...
- jquery多级手风琴插件–accordion.js
手风琴菜单一般用于下拉导航,由于外观非常简洁,使用起来跟手风琴一样可以拉伸和收缩而得名,项目中适当应用手风琴效果会给用户带来非常好的体验.本文借助jQuery插件轻松打造一个非常不错的手风琴效果的菜单 ...
- webkit javascript
http://www.infoq.com/cn/news/2013/02/douglas-interview http://blog.csdn.net/horkychen/article/detail ...
- cisco telnet会话SESSION管理及相关Dynagen配置文件
#Lab 2-5 autostart = False [localhost] [[2621]] ram = 64 image = C:\Program Files (x86)\Dynamips\ima ...
- sqlite的源代码加密,以及其它一些文章
一. 给数据库加密 前面所说的内容网上已经有很多资料,虽然比较零散,但是花点时间也还是可以找到的.现在要说的这个——数据库加密,资料就很难找.也可能是我操作水平不够,找不到对应资料.但不管 ...