萌萌的网络流~~

上下界网络流:

  sgu 194 (无源汇的上下界网络流):

  题意:给出一个网络,每条边有上下界,问是否存在可行流。如果存在,输出经过每条边的流量。

  建图:每条边必须有li的流量,那么新建超级源点和超级汇点,然后统计每个点的“入度”和“出度”,然后源点和每个点建一条流量为“入度”的边,每个点和汇点建一条流量为“出度”的边。为了流量平衡,每条边取原有上界-原有下界为流量,然后加入网络。(还有种做法是每个点统计出度和入度,判断是正是负来决定它和源点还是汇点建边。这种做法运行效率更高一些。)

  题目给的图因为没有源点和汇点,所以我觉得统计最大流是没有意义的。对于我们自己建的图,判断一下每条边的下界的和是否等于最大流,以此来判定是否有可行流就行了。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cstring>
 6 #include <ctime>
 7 #define FORD(i,r,l) for(int i=(r);i>=(l);i--)
 8 #define rep(i,n) for(int i=0;i<(n);i++)
 9 #define req(i,l,n) for(int i=(l);i<(n);i++)
10 using namespace std;
11 typedef long long LL;
12 const int maxn=205+1,maxm=120000;
13 const LL jx=0x7fffffffffffffff;
14
15 int pos,ta[maxn],lin[maxm],sd[maxm],sl[maxm];
16 void biu(int s,int t,int c)
17 {
18     ++pos; lin[pos]=ta[s]; ta[s]=pos; sd[pos]=t; sl[pos]=c;
19     ++pos; lin[pos]=ta[t]; ta[t]=pos; sd[pos]=s; sl[pos]=0;
20 }
21
22 int nn;
23 int h[maxn];
24 int vh[maxn];
25 int aug(int v,int deta)
26 {
27     if (v==nn) return deta;
28     int mins=nn-1,augc,bak=deta;
29     for (int i=ta[v];i;i=lin[i])
30         if (sl[i])
31         {
32             if (h[v]==h[sd[i]]+1)
33             {
34                 augc=min(deta,sl[i]);
35                 augc=aug(sd[i],augc);
36                 deta-=augc;
37                 sl[i]-=augc; sl[(i+1^1)-1]+=augc;
38                 if (!deta) break;
39                 if (h[nn-1]>=nn) return bak-deta;
40             }
41             mins=min(mins,h[sd[i]]);
42         }
43     if (bak==deta)
44     {
45         vh[h[v]]--; if (vh[h[v]]==0) h[nn-1]=nn;
46         h[v]=mins+1; vh[h[v]]++;
47     }
48     return bak-deta;
49 }
50
51 int n,m;
52 int rd[201],cd[201];
53 int pipel[maxm];
54 int main(){
55     scanf("%d%d",&n,&m);
56     int u,v,l,c;
57     for (int i=1;i<=m;i++)
58     {
59         scanf("%d%d%d%d",&u,&v,&l,&c);
60         pipel[i]=l;
61         rd[v]+=l; cd[u]+=l;
62         biu(u,v,c-l);
63     }
64     nn=n+2;//--
65     LL sum=0;
66     for (int i=1;i<=n;i++)
67     {
68         if (rd[i]) biu(nn-1,i,rd[i]);
69         if (cd[i]) biu(i,nn,cd[i]);
70         sum+=rd[i];
71     }
72     LL flow=0;
73     while (h[nn-1]<nn) flow+=aug(nn-1,0x7fffffff);
74     if (sum!=flow) puts("NO\n");
75     else
76     {
77         puts("YES");
78         for (int i=1;i<=m;i++) printf("%d\n",pipel[i]+sl[i*2]);
79     }
80     return 0;
81 }

  (提示:如果第7个点WA了,说明你没开long long或者数组范围没够。)

时间: 2024-11-02 07:38:46

萌萌的网络流~~的相关文章

hiho 第118周 网络流四&#183;最小路径覆盖

描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接.在一个景点游览完后,可以顺着游览线路前往下一个景点. 为了避免游客重复游览同一个景点,游览线路保证是没有环路的. 每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回.每个景点只会有一个调查团经过,不会重复调查. 举个例子: 上图中一共派出了3个调查团: 1

POJ2584 T-Shirt Gumbo 二分图匹配(网络流)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int inf=0x3f3f3f3f; 6 const int sink=30; 7 8 struct Edge 9 { 10 int to; 11 int next; 12 int capacity; 13 14 void assign(int t,int n,int c) 15 { 16 to=t; next=n; ca

UVA 1306 - The K-League(网络流)

UVA 1306 - The K-League 题目链接 题意:n个球队,已经有一些胜负场,现在还有一些场次,你去分配胜负,问每支球队有没有可能获胜 思路:网络流公平分配模型,把场次当作任务,分配给人,然后先贪心,枚举每个人,让这些人能赢的都赢,剩下的去建图,每个源点连向比赛容量为场次,每个比赛连向2个球队,容量无限大,每个球队连向汇点,容量为每个的人的总和减去当前已经赢的,建完图跑一下最大流,然后判断源点流出的是否都满流即可 代码: #include <cstdio> #include &l

hdu 4975 A simple Gaussian elimination problem.(网络流,判断矩阵是否存在)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4975 Problem Description Dragon is studying math. One day, he drew a table with several rows and columns, randomly wrote numbers on each elements of the table. Then he counted the sum of each row and col

POJ训练计划3422_Kaka&#39;s Matrix Travels(网络流/费用流)

解题报告 题目传送门 题意: 从n×n的矩阵的左上角走到右下角,每次只能向右和向下走,走到一个格子上加上格子的数,可以走k次.问最大的和是多少. 思路: 建图:每个格子掰成两个点,分别叫"出点","入点", 入点到出点间连一个容量1,费用为格子数的边,以及一个容量∞,费用0的边. 同时,一个格子的"出点"向它右.下的格子的"入点"连边,容量∞,费用0. 源点向(0,0)的入点连一个容量K的边,(N-1,N-1)的出点向汇点连一

HDU 3488Tour(网络流之最小费用流)

题目地址:hdu3488 这题跟上题基本差不多啊....详情请戳这里. 另外我觉得有要改变下代码风格了..终于知道了为什么大牛们的代码的变量名都命名的那么长..我决定还是把源点与汇点改成source和sink吧..用s和t太容易冲突了...于是如此简单的一道题调试到了现在..sad... 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #

LibreOJ #6002. 「网络流 24 题」最小路径覆盖

内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 网络流 最大流 屠龙宝刀点击就送 #include <cstring> #include <cstdio> #include <queue> #define N 6005 #define inf 0x3f3f3f3f using namespace std; bool flag[N]; int n,m,dep[N],nextt[N<

POJ 1273 Drainage Ditches (网络流Dinic模板)

Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage

网络流(进阶)

最大流:DINIC or SAP 最小费用最大流:SPFA+增广(费用的值较离散) or ZKW(费用的值集中) 有源汇的上下界最大流:新建s', t',用(i, j, l, r)表示i到j有一条下界为l上界为r的边,将每条这样的边拆成(s', j, 0, l), (i, t', 0, l), (i, j, 0, r-l),加入边(t, s, 0, max)再从s'到t'求最大流,再去掉(t, s, 0, max)这条边,从s到t求最大流 有源汇的上下界最小可行流:基本同上,将最后一步改成从t到