sgu438

来源:互联网 发布:wince同步软件 win7 编辑:程序博客网 时间:2024/05/17 04:50

经典题


然而我因为i打成j    j打成i   搞了1H

我¥%#¥%(此处省略1W字脏话


为何如此心不在焉。。

我明明很专注。。。。。


此处不忍吐槽tg教育

妈的晚一点起床早一点睡觉不好?


非要23睡 6起  弄的人都是虚的  干啥都没精神   还好意思说国民体质不好

感觉自己一天不如一天了。。。

浑身难受


妈呀扯到那里去了。。


#include <cstdio>#include <cstring>#include <iostream>using namespace std;int N,M,D,W,T;int x[55],y[55],c[55];int h[10100],gap[10100],sz;int U[2510],V[2510],CNT;struct edge {int v,f,next;}e[600010];int head[10100],cnt;int read_int () {char c = getchar();int re = 0;for(;c > '9' || c < '0';c = getchar());for(;c >= '0' && c <= '9';c = getchar())re = re * 10 + c - '0';return re;}void adde (int u,int v,int f) {e[cnt].v = v;e[cnt].f = f;e[cnt].next = head[u];head[u] = cnt++;e[cnt].v = u;e[cnt].f = 0;e[cnt].next = head[v];head[v] = cnt++;}int dfs (int u,int minf) {if(u == sz + sz + 1)return minf;int chan = sz + sz + 1;int leftf = minf;for(int i = head[u];i != -1;i = e[i].next) {int v = e[i].v;if(e[i].f) {if(h[v] == h[u] - 1) {int t = dfs(v,min(e[i].f,leftf));e[i].f -= t;e[i ^ 1].f += t;leftf -= t;if(h[0] >= sz + sz + 2)return minf - leftf;if(!leftf)break;}chan = min(chan,h[v]);}}if(leftf == minf) {if(--gap[h[u]] == 0)h[0] = sz + sz + 2;++gap[h[u] = chan + 1];}return minf - leftf;}bool sap () {cnt = 0;memset(head,-1,sizeof head);sz = T * N;for(int i = 1;i <= T;++i) {for(int j = 1;j <= N;++j) {if(y[j] <= D)adde(0,j + (i - 1) * N,0x3f3f3f3f);}}for(int i = 1;i <= T - 1;++i) {for(int j = 1;j <= CNT;++j) {adde(U[j] + (i - 1) * N + sz,V[j] + i * N,0x3f3f3f3f);adde(V[j] + (i - 1) * N + sz,U[j] + i * N,0x3f3f3f3f);}}for(int i = 1;i <= T;++i) {for(int j = 1;j <= N;++j) {adde(j + (i - 1) * N,j + (i - 1) * N + sz,c[j]);}}for(int i = 1;i <= T;++i) {for(int j = 1;j <= N;++j) {if(W - y[j] <= D)adde(j + (i - 1) * N + sz,sz + sz + 1,0x3f3f3f3f);}}int re = 0;memset(gap,0,sizeof gap);memset(h,0,sizeof h);gap[0] = sz + sz + 2;while(h[0] < sz + sz + 2)re += dfs(0,0x3f3f3f3f);if(re >= M)return 1;return 0;}int main () {N = read_int();M = read_int();D = read_int();W = read_int();for(int i = 1;i <= N;++i) {x[i] = read_int();y[i] = read_int();c[i] = read_int();}for(int i = 1;i <= N - 1;++i) {for(int j = i + 1;j <= N;++j) {if((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) <= D * D) {U[++CNT] = i;V[CNT] = j;}}}if(D >= W) {printf("1\n");return 0;}for(int i = 1;i <= 100;++i) {T = i;if(sap()) {printf("%d\n",i + 1);return 0;}}printf("IMPOSSIBLE\n");}


0 0
原创粉丝点击