POJ 3498 拆點 最大流

2021-08-27 04:29:11 字數 1756 閱讀 9829

大概題意:

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

那麼這題是一道網路流,題目要求的是最後能夠成為聚會地點的浮冰標號,這裡可以聯想到需要列舉匯點,並且可以根據跳躍距離的限制n2列舉進行建邊,但是每個浮冰的承受能力是點的容量,怎樣轉化為邊的容量? 一般平時碰到的點的容量,可以直接連到匯點上, 要麼你就拆點,將其變為兩個點,中間的邊容量就是點容量, 那麼本題由於每塊浮冰是可以去往多塊浮冰的,所以直接連線匯點肯定不行,那麼就需要進行拆點了

#include #include #include #include #include #include #include #include #include #define eps 1e-5

#define maxn 222

#define maxm 55555

#define inf 100000007

using namespace std;

struct node

edge[maxm];

int dist[maxn], nm[maxn], src, des, n;

int head[maxn], e;

void add(int x, int y, int c)

void rev_bfs()

q[t++] = des;

dist[des] = 0;

nm[0] = 1;

while(h != t)

}}void init()

int maxflow()

total += tf;

u = src;

}int i;

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

if(edge[i].c > 0 && dist[u] == dist[edge[i].v] + 1)break;

if(i != -1) // find an admissible arc, then advance

else // no admissible arc, then relabel this vtex

}return total;

}int nt, v[maxn], f[maxn], out[maxn];

double d, x[maxn], y[maxn];

double dis(int i, int j)

int main()

src = 2 * nt + 1;

n = 2 * nt + 1;

int cnt = 0;

for(int k = 1; k <= nt; k++)

for(int i = 1; i <= nt; i++) add(src, i, v[i]), add(i, i + nt, f[i]);

des = k;

int flow = maxflow();

//printf("%d\n", flow);

if(flow == sum) out[cnt++] = k - 1;

}if(!cnt) printf("-1\n");

else

}return 0;

}

POJ 3498 拆點 最大流

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

poj 3498 最大流 拆點

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

poj 3498 網路流 拆點

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