poj 3498 網路流 拆點

2022-05-24 10:39:10 字數 1178 閱讀 4237

題意:某個冰塊上有a只企鵝,總共可以跳出去b只,問是否可能所有的企鵝都跳到某一塊冰塊上,輸出所有的可能的冰塊的編號。

由於每個點只能跳出去m只企鵝,所以要拆點

假如不拆點,乙個點到另乙個點可能會跳多於m只企鵝

通過拆點後u->u'間的容量來完成題目的要求(對點的一些限制)

建圖:i->i+n 容量為m    i+n->j容量為inf

新建源點s,s->i的容量為i點企鵝的個數

然後列舉匯點求最大流就可以判斷某個點是否符合條件

view code

#include

#include

#include

#include

using

namespace std;

const

double eps = 1e-8;

const

int max=10000;

const

int inf=1000000000;

struct point p[200];

double d;

double dis(point a,point b)

struct

edge[1000000];

int e,head[max];

int gap[max],cur[max];

int pre[max],dis[max];

void add_edge(int s,int t,int c,int cc)

int min(int a,int b)

maxflow+=aug;

aug=-1;

}goto loop;}}

int mindis=n;

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

return maxflow;

}int main()

for(i=1;i<=n;i++)}}

int flag=0;

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

for(j=0;j2) edge[j].c+=edge[j^1].c,edge[j^1].c=0; //

每次流完之後恢復原圖

}if(!flag) printf("

-1\n

");else printf("

\n");

}}

POJ 3498 拆點 最大流

大概題意 在南極的海洋上,有一些企鵝站在一些浮冰上,這些企鵝想聚在一塊,也就是到某塊浮冰上聚會,但是它們不想游泳,只想從一塊浮冰跳到另一塊上,自身的跳躍距離題中已經給出來了,然後是每個浮冰的座標,該浮冰上已經有個多少個企鵝,以及浮冰的承受能力,所謂承受能力不是指能載動多少企鵝,題目中說了每個浮冰載企...

POJ 3498 拆點 最大流

大概題意 在南極的海洋上,有一些企鵝站在一些浮冰上,這些企鵝想聚在一塊,也就是到某塊浮冰上聚會,但是它們不想游泳,只想從一塊浮冰跳到另一塊上,自身的跳躍距離題中已經給出來了,然後是每個浮冰的座標,該浮冰上已經有個多少個企鵝,以及浮冰的承受能力,所謂承受能力不是指能載動多少企鵝,題目中說了每個浮冰載企...

poj 3498 最大流 拆點

思路 首先設乙個超級源點,將源點與各地相連,邊容量為各點目前的企鵝數量,然後就是對每個冰塊i進行拆點了 i,i n 邊容量為能夠接受的受損程度,這樣就把點權問題轉化為邊權問題了,然後就是對於那些能夠相互跳躍的冰塊之間連邊 i n,j j n,i 邊容量為inf。最後就是列舉匯點看是否等於總數。1 i...