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

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 typedef long long ll;
 6 inline void read(int &x){
 7     x=0;char ch;bool flag = false;
 8     while(ch=getchar(),ch<‘!‘);if(ch == ‘-‘) ch=getchar(),flag = true;
 9     while(x=10*x+ch-‘0‘,ch=getchar(),ch>‘!‘);if(flag) x=-x;
10 }
11 inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
12 inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
13 const int maxn = 200010;
14 struct Edge{
15     int to,next,flow;
16     bool flag;
17 }G[maxn<<1];
18 int head[maxn],cnt=1;
19 inline void add(int u,int v,int c){
20     G[++cnt].to = v;
21     G[cnt].next = head[u];
22     G[cnt].flow = c;
23     head[u] = cnt;
24 }
25 int q[maxn],l,r,flow[maxn],n;
26 #define v G[i].to
27 inline void bfs(){
28     l = 0;r = -1;q[++r] = 1;
29     while(l <= r){
30         int u = q[l++];
31         for(int i = head[u];i;i=G[i].next){
32             if(G[i].flag || G[i^1].flag) continue;
33             G[i].flag = true;
34             flow[v] -= G[i].flow;
35             if(flow[v] == 0 && v != n) q[++r] = v;
36         }
37     }
38 }
39 #undef v
40 int main(){
41     int m;read(n);read(m);
42     for(int i=1,u,v,d;i<=m;++i){
43         read(u);read(v);read(d);
44         add(u,v,d);add(v,u,d);
45         flow[u] += d;flow[v] += d;
46     }
47     for(int i=1;i<=n;++i) flow[i] >>= 1;
48     bfs();
49     for(int i=2;i<=cnt;i+=2){
50         printf("%d\n",G[i^1].flag);
51     }
52     getchar();getchar();
53     return 0;
54 }
时间: 2024-10-13 16:05:45

CodeForces - 269C Flawed Flow的相关文章

Codeforces 270E Flawed Flow 网络流问题

题意:给出一些边,给出边的容量.让你为所有边确定一个方向使得流量最大. 题目不用求最大流, 而是求每条边的流向,这题是考察网络流的基本规律. 若某图有最大,则有与源点相连的边必然都是流出的,与汇点相连的边必然是流入的,其它所有点流入和流出的流量是相等的. 我们可以根据这一规律来求解. 先求出所有点(除了源点和汇点)的总流量(表示流入的流量的2倍),每次流过该边,更新的时候减去流入流量的2倍. 从源点出发广搜每个点,搜的过程可以确定经过边的流向,当某个点的剩余总流量为0时,表示流入该点的流量边已经

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

Emuskald considers himself a master of flow algorithms. Now he has completed his most ingenious program yet — it calculates the maximum flow in an undirected graph. The graph consists of n vertices and m edges. Vertices are numbered from 1 to n. Vert

【CodeForces】990F Flow Control

题目链接 Luogu & CodeForces 题目描述 You have to handle a very complex water distribution system. The system consists of nn junctions and mm pipes, ii -th pipe connects junctions xixi and yiyi . The only thing you can do is adjusting the pipes. You have to c

CF 269 E Flawed Flow

Emuskald considers himself a master of flow algorithms. Now he has completed his most ingenious program yet - it calculates the maximum flow in an undirected graph. The graph consists of n vertices and m edges. Vertices are numbered from 1 to n. Vert

Codeforces Round #354 (Div. 2)

5/5 水了场CF,写个水水地题解~~ 题A CodeForces 676A 题意:给你一个排列,问你交换一次,最大最小位置最远是多少? 题解:暴力交换,暴力算,反正数据小.偷懒被hack更惨!! 1 /*zhen hao*/ 2 #include <bits/stdc++.h> 3 using namespace std; 4 5 #define lson l, m, rt*2 6 #define rson m + 1, r, rt*2+1 7 #define xx first 8 #def

Codeforces Gym 100203I I WIN 最大流

原题链接:http://codeforces.com/gym/100203/attachments/download/1702/statements.pdf 题解 首先寻找每个I,然后枚举形状,如果匹配的话,就将源点连一条边到当前匹配的W,再从W连条边到I,I需要拆点,然后将拆点后面的那个点连接到N,从N连接到汇点.所有边的容量都是1.需要注意避免产生重边.然后最大流就是答案. 代码 #include<iostream> #include<stack> #include<ve

CodeForces 362E Petya and Pipes

Petya and Pipes Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Original ID: 362E64-bit integer IO format: %I64d      Java class name: (Any) A little boy Petya dreams of growing up and becoming the Head Berland Pl

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

题目 Source http://codeforces.com/problemset/problem/717/G Description You have recently fallen through a hole and, after several hours of unconsciousness, have realized you are in an underground city. On one of your regular, daily walks through the un

Codeforces Round #296 (Div. 2) (ABCDE题解)

比赛链接:http://codeforces.com/contest/527 A. Playing with Paper time limit per test:2 seconds memory limit per test:256 megabytes One day Vasya was sitting on a not so interesting Maths lesson and making an origami from a rectangular a mm ?×? b mm sheet