poj 3498 最大流 拆點

2021-09-06 11:44:18 字數 1597 閱讀 9545

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

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

using

namespace

std;

8#define maxn 222

9#define maxm 2222222

10#define inf 1<<30

1112

struct

edgeedge[maxm];

1516

intn,ne,vs,vt,nv;

17double

dist;

18int

head[maxn];

1920

void insert(int u,int v,int

cap)

2132

33int

level[maxn],gap[maxn];

34void bfs(int

vt)3552}

53}5455

intpre[maxn],cur[maxn];

56int sap(int vs,int

vt)57

79 aug=inf;80}

81break;82

}83}84

if(flag)continue;85

int minlevel=nv;

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

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

;94 level[u]=minlevel+1

;95 gap[level[u]]++;

96 u=pre[u];97}

98return

maxflow;99}

100struct

pointp[maxn];

104105

double get_dist(int i,int

j)106

111void

build()

112124

}125

}126

}127

intans[maxn],cnt;

128int

main()

129139 cnt=0

;140

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

144if

(cnt)

148 printf("\n"

);149 }else

150 puts("-1"

);151

}152

return0;

153 }

view code

POJ 3498 拆點 最大流

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

POJ 3498 拆點 最大流

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

poj 3498 網路流 拆點

題意 某個冰塊上有a只企鵝,總共可以跳出去b只,問是否可能所有的企鵝都跳到某一塊冰塊上,輸出所有的可能的冰塊的編號。由於每個點只能跳出去m只企鵝,所以要拆點 假如不拆點,乙個點到另乙個點可能會跳多於m只企鵝 通過拆點後u u 間的容量來完成題目的要求 對點的一些限制 建圖 i i n 容量為m i ...