loj 1154 最大流 列舉匯點

2021-06-22 05:43:46 字數 1611 閱讀 3360

思路:拆點,容量為最多能跳的步數,然後設立乙個超級源點,源點與各點兩連邊,容量為一開始的企鵝數,最後就是列舉匯點了,跑最大流驗證即可。

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8#define maxn 222

9#define maxm 222222

10#define inf 1<<30

11#define fill(a,b) memset(a,b,sizeof(a))

1213

struct

edgeedge[maxm];

1617

intn,vs,vt,nv,ne,head[maxn];

18double

d;19

2021

void insert(int u,int v,int

cap)

2233

34int

level[maxn],gap[maxn];

35void bfs(int

vt)3653}

54}5556

intpre[maxn],cur[maxn];

57int sap(int vs,int

vt)58

78 aug=inf;79}

80break;81

}82}83

if(flag)continue;84

int minlevel=nv;

85for(int i=head[u];i!=-1;i=edge[i].next)91}

92if(--gap[level[u]]==0)break

;93 level[u]=minlevel+1

;94 gap[level[u]]++;

95 u=pre[u];96}

97return

maxflow;98}

99100

struct

nodenode[maxn];

104105

double get_dist(int i,int

j)106

111112

void build(int

ed)113

122for(int i=1;i<=n;i++)

128}

129}

130insert(ed,vt,inf);

131}

132133

intmain()

134144 flag=0

;145 printf("

case %d:

",t++);

146//

列舉集中點

147for(int i=1;i<=n;i++)

151if(!flag)printf("-1"

);152 puts(""

);153

}154

return0;

155 }

view code

loj 1154 最大流 列舉匯點

思路 拆點,容量為最多能跳的步數,然後設立乙個超級源點,源點與各點兩連邊,容量為一開始的企鵝數,最後就是列舉匯點了,跑最大流驗證即可。1 include2 include3 include4 include5 include6 include7 using namespace std 8 defin...

LOJ 116 有源匯上下界最大流

有源匯上下界最大流 模板題。具體講解見 sap演算法或dinic演算法跑出來的是殘量網路上,還能增加多少流量!s t 的最大流解法 建立附加源匯ss,tt。建法詳見上面的博文 並建邊t s,容量為正無窮。跑一遍ss tt最大流,若等於附加出邊容量和,即滿足下界滿流,則繼續求最大流,否則此題無解 無最...

有源匯有上下界最大流詳解(loj116)

例題鏈結 首先吐槽一下放題人 我不知道是不是我理解錯了什麼。題目描述裡就乙個上下界然後就說要求最大流。直接建上界然後跑最大流不就完了麼?實際上原題是這樣的 求出乙個流使得源點的總流出量等於匯點的總流入量,其他的點滿足流量守恆,而且每條邊的流量滿足上界和下界限制。在這些前提下要求總流量最大。沒學過無源...