大概題意:
在南極的海洋上, 有一些企鵝站在一些浮冰上,這些企鵝想聚在一塊,也就是到某塊浮冰上聚會, 但是它們不想游泳,只想從一塊浮冰跳到另一塊上,自身的跳躍距離題中已經給出來了,然後是每個浮冰的座標,該浮冰上已經有個多少個企鵝,以及浮冰的承受能力,所謂承受能力不是指能載動多少企鵝,題目中說了每個浮冰載企鵝是沒有問題的,但是從浮冰往外跳會導致浮冰破損,這裡的承受能力就是能跳出去多少次企鵝。
那麼這題是一道網路流,題目要求的是最後能夠成為聚會地點的浮冰標號,這裡可以聯想到需要列舉匯點,並且可以根據跳躍距離的限制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 ...