思路:拆點,容量為最多能跳的步數,然後設立乙個超級源點,源點與各點兩連邊,容量為一開始的企鵝數,最後就是列舉匯點了,跑最大流驗證即可。
1 #include2 #include3 #include4 #include5 #include6 #include7view codeusing
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 }
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)
例題鏈結 首先吐槽一下放題人 我不知道是不是我理解錯了什麼。題目描述裡就乙個上下界然後就說要求最大流。直接建上界然後跑最大流不就完了麼?實際上原題是這樣的 求出乙個流使得源點的總流出量等於匯點的總流入量,其他的點滿足流量守恆,而且每條邊的流量滿足上界和下界限制。在這些前提下要求總流量最大。沒學過無源...